TITLE 'MIKE''S PCS EDITOR (MEDIT) MAY. 15, 1981' ; ; ; ; WRITTEN BY: MIKE LORENZEN ; ; ; ; ATARI COMPANY PRIVATE TRADE SECRETS ENCLOSED ; ; ; COPYRIGHT ATARI 1981 EJECT ; **** EQUATES **** ; ; HDAY EQU '1' ;HI DAY LDAY EQU '5' ;LOW DAY HMONTH EQU '0' ;HI MONTH LMONTH EQU '5' ;LOW MONTH HYEAR EQU '8' ;HI YEAR LYEAR EQU '1' ;LOW YEAR ; DOS3 EQU 0 ;0 IF DOS-2; 1 IF DOS-3 PROT EQU 0 ;1 IF WANT PROTECTION CODE; 0 IF DON'T ; IF DOS3-1 ;ASSEMBLY FOR DOS-2 EDORG EQU $2600 ;DOS 3 EDITOR ORG ADDRESS FNLEN EQU 8 ;DOS 2 FILENAME LENGTH SECSEC EQU $2D0 ;DOS 2 SECRET SECTOR ENDIF IF DOS3 ;ASSEMBLY FOR DOS-3 EDORG EQU $3000 ;DOS 2 EDITOR ORG ADDRESS FNLEN EQU 12 ;DOS 3 FILENAME LENGTH SECSEC EQU $004 ;DOS 3 SECRET SECTOR ENDIF ; DATE EQU HDAY+LDAY+HMONTH+LMONTH+HYEAR+LYEAR ; IF PROT ;ASSEMBLY CHECKSUMS ONLY IF WANT PROTECTED COPIES IF DOS3-1 ;IF DOS 2 THEN MODIFY CHECKSUM FOR MENU DOS3RC EQU 0 ;NO DIFFERENCE FROM DOS-2 ENDIF IF DOS3 ;IF DOS 3 THEN MODIFY CHECKSUM FOR MENU DOS3RC EQU -41 ;DIFFERENCE IN CHECKSUM FOR DOS-3 ENDIF ; ;CHKSUM EQU $2FF8+DATE+DOS3RC FRED THORLIN ;CHKSUM EQU $2F5A+DATE+DOS3RC DALE YOCUM ;CHKSUM EQU $3139+DATE+DOS3RC MACROTRONICS ;CHKSUM EQU $2E64+DATE+DOS3RC SORCIM ;CHKSUM EQU $3236+DATE+DOS3RC MIKE EKBERG ;CHKSUM EQU $31EC+DATE+DOS3RC TANDEM ;CHKSUM EQU $3117+DATE+DOS3RC MIKE LORENZEN ;CHKSUM EQU $30BF+DATE+DOS3RC MIKE MURDOCK ;CHKSUM EQU $3096+DATE+DOS3RC BRIAN JOHNSTON ;CHKSUM EQU $306D+DATE+DOS3RC LARRY SUMMERS ;CHKSUM EQU $2FC5+DATE+DOS3RC HARRY BROWN ;CHKSUM EQU $2F14+DATE+DOS3RC PAM JONES ;CHKSUM EQU $2EFF+DATE+DOS3RC ECKSTROM ;CHKSUM EQU $320E+DATE+DOS3RC DAVE COMSTOCK ;CHKSUM EQU $3294+DATE+DOS3RC STEVE TECOTZKY ;CHKSUM EQU $330F+DATE+DOS3RC STEVE BITTROLFF ;CHKSUM EQU $2E0F+DATE+DOS3RC KELCY ;CHKSUM EQU $3109+DATE+DOS3RC PAUL LAUGHTON ;CHKSUM EQU $3228+DATE+DOS3RC LISA BAILEY ;CHKSUM EQU $32AF+DATE+DOS3RC CAROL ABBOTT ;CHKSUM EQU $3338+DATE+DOS3RC JOHN POWERS ;CHKSUM EQU $2EA7+DATE+DOS3RC CYNTHIA RUSSELL ;CHKSUM EQU $334B+DATE+DOS3RC DOUGLAS CHOREY ;CHKSUM EQU $34ED+DATE+DOS3RC VINCE HAU-LEONG WU ;CHKSUM EQU $329E+DATE+DOS3RC KEITH BALL ;CHKSUM EQU $32F9+DATE+DOS3RC JEFF MCKENNA CHKSUM EQU $32EC+DATE+DOS3RC ;CPL, INC. #1 ;CHKSUM EQU $3331+DATE+DOS3RC CPL, INC. #2 ENDIF ; ; CIO EQU $E456 ;CIO ENTRY POINT OPEN EQU $03 ;CIO OPEN COMMAND BYTE CLOSE EQU $0C ;CIO CLOSE COMMAND BYTE GETCHR EQU $07 ;CIO GET CHARACTER COMMAND BYTE GETREC EQU $05 ;CIO GET-RECORD COMMAND BYTE PUTREC EQU $09 ;CIO PUT-RECORD COMMAND BYTE PUTCHR EQU $0B ;CIO PUT-CHARACTER COMMAND BYTE RENAME EQU $20 ;CIO RENAME COMMAND BYTE DELETE EQU $21 ;CIO DELETE COMMAND BYTE ; HPOS3 EQU $D003 ;HORZ. POSITION OF MIKE A. CURSOR PLYR #3 GRAFP3 EQU $D010 ;GRAFIX REG #3 GRACTL EQU $D01D ;CTIA GRAFIX CONTROL CONSOL EQU $D01F ;KEYBOARD SPEAKER ADDRESS IRQEN EQU $D20E ;IRQ INTERRUPT ENABLE SKSTAT EQU $D20F ;SERIAL & KEYBOARD STATUS PORT DMACTL EQU $D400 PMBASE EQU $D407 ;PLAYER MAP BASE WSYNC EQU $D40A ;WAIT FOR SYNC ADDRESS ; CIX EQU $F2 ;F.P. INDEX TO BUFFER AFP EQU $D800 ;ATASCII TO F.P. ROUTINE FPI EQU $D9D2 ;F.P. TO INTEGER ROUTINE FASC EQU $D8E6 ;O.S. CONVERT F.P. TO ATASCI IFP EQU $D9AA ;O.S. CONVERT INTEGER TO F.P. ; IOCB EQU $340 ;BEGINNING OF IOCB STORAGE ICHID EQU IOCB+0 ICCOM EQU IOCB+2 ICBAL EQU IOCB+4 ICBAH EQU IOCB+5 ICBLL EQU IOCB+8 ICBLH EQU IOCB+9 ICAX1 EQU IOCB+10 ICAX2 EQU IOCB+11 ; DOSVEC EQU $A ;O.S. DOS VECTOR POKMSK EQU $10 ;IRQEN SHADOW BRKKEY EQU $11 ;O.S. BREAK KEY FLAG RTCLOK EQU $12 ;O.S. REAL TIME CLOCK ATRACT EQU $4D ;O.S. ATTRACT FLAG (ZERO CLEARS, MINUS CAUSES ATTRACT) ROWCRS EQU $54 COLCRS EQU $55 SAVMSC EQU $58 ;O.S. RAM BUFFER FOR 40-CHAR MODE FRO EQU $D4 ;O.S. F.P. LOCATION INBUFF EQU $F3 ;O.S. F.P. LOCATION CDTMV3 EQU $21C ;TIMER 3 COUNTER CDTMA2 EQU $228 ;TIMER 2 VECTOR CDTMF3 EQU $22A ;TIMER 3 FLAG CDTMF4 EQU $22C ;TIMER 4 FLAG CDTMF5 EQU $22E ;TIMER 5 FLAG SDMCTL EQU $22F DLISTL EQU $230 COLDST EQU $244 ;O.S. COLD-START FLAG ($FF POWER-UP, $00 RESET) GPRIOR EQU $26F ESCFLG EQU $2A2 ;O.S. ESCAPE SEQUENCE FLAG ($FF YES, $00 NO) SHFLOK EQU $2BE ;O.S. CASE LOCK ($00 NO-LOCK, $40 CAPS, $80 CTRL) COLP3 EQU $2C3 ;O.S. PLAYER 3 COLOR (CURSOR) COLOR1 EQU $2C5 ;O.S. PF1 COLOR (CHAR. LUM.) COLOR2 EQU $2C6 ;O.S. PF2 COLOR (BACKGROUND) COLOR4 EQU $2C8 ;O.S. PF4 COLOR (BORDER) MEMTOP EQU $2E5 ;O.S. LAST AVAIL. BYTE OF USER AREA MEMLO EQU $2E7 ;O.S. FIRST AVAIL. BYTE OF USER AREA CH EQU $2FC ;O.S. KEYSTOKE WAITING FLAG SSFLAG EQU $2FF ;O.S. START/STOP FLAG SETVBV EQU $E45C ;SET TIMER ROUTINE ; TAB EQU $7F ;ATASCI TAB CODE CR EQU $9B ;ATASCI CARRIAGE-RETURN CODE ESCAPE EQU $1B ;ATASCI ESCAPE CODE KBACKS EQU $7E ;ATASCI BACKSPACE CODE WCCHAR EQU $80+'?' ;SEARCH WILDCARD CHARACTER BELLEN EQU 4 ;LENGTH OF WARNING BELL EJECT ; **** ZERO PAGE RAM ASSIGNMENTS **** ; ; ORG $80 ; ; ZINIT ; ZERO INIT BLOCK BEGINS HERE (ZP LOCATIONS ; THAT WILL SET TO ZERO UPON INIT - MUST BE ; CONTIGUOUS) ; L1 DS 2 ;POINTS TO BEGINNING OF TEXT BEFORE CURSOR L2 DS 2 ;POINTS TO END OF TEXT BEFORE CURSOR L3 DS 2 ;POINTS TO BEGINNING OF TEXT AFTER CURSOR L4 DS 2 ;POINTS TO END OF TEXT AFTER CURSOR EOFLAG DS 1 ;END-OF-FILE FLAG FOR INPUT FILE MODE DS 1 ;FLAG TELLS IF IN COMMAND MODE OR INSERT MODE LASTKY DS 1 ;SAVED LAST KEYSTROKE ; ZINITL EQU *-ZINIT ;END OF ZERO INIT BLOCK ; ; SIZMAR DS 1 ;NUMBER OF CHARACTERS IN MARGIN LINCNT DS 1 ;LOOP COUNTER FOR WHAT DISPLAY LINE LINSIZ DS 1 ;NUMBER OF NET CHARACTERS IN DISPLAY LINE COLCNT DS 1 ;LOOP COUNTER FOR WHAT DISPLAY COLUMN COLCUR DS 1 ;COLUMN CURSOR IS LOCATED AT ROWCUR DS 1 ;ROW CURSOR IS LOCATED AT LOGCOL DS 1 ;LOGICAL COLUMN DISPLAY IS AT SAVLOG DS 1 ;LOGICAL COLUMN CURSOR IS AT ; SPOINI DS 2 ;POINTER TO SCREEN CHARACTERS (INPUT) SPOINO DS 2 ;POINTER TO SCREEN CHARACTERS (OUTPUT) BEGDIS DS 2 ;POINTER TO 1ST CHAR TO DISPLAY ; CRFLAG DS 1 ;FLAG MEANS DISPLAYING IMAGINARY CR TFLAG DS 1 ;FLAG MEANS DISPLAYING IMAGINARY TAB TEMP1 DS 1 ;TEMP LOCATION TEMP2 DS 1 ;TEMP LOCATION ; ATREAL DS 1 ;FLAG TELLS IF CURRENT POSITION REAL OR IMAG. BEGCOL DS 1 ;POINTER OF COLUMN NUMBER OF 1ST CHAR. OF DISPLAY TEMP3 DS 1 ;TEMP LOCATION TEMP4 DS 1 ;TEMP LOCATION LINSZ3 DS 1 ;VALUE OF LINSIZ MINUS ONE CDCNTR DS 1 ;CURSOR DOWN COUNTER CDFLAG DS 1 ;CURSOR DOWN FLAG BEGTFG DS 1 ;FLAG TELLS IF DISPLAY STARTS IN MIDDLE OF TAB TEMP5 DS 1 ;TEMP LOCATION TEMP6 DS 1 ;TEMP LOCATION TEMP7 DS 1 ;TEMP LOCATION TEMP8 DS 1 ;TEMP LOCATION BEGFRE DS 2 ;BEGINNING OF INSERTABLE-MEMORY (BUBLE) ENDFRE DS 2 ;END OF INSERTABLE-MEMORY (BUBLE) UMEMLO DS 2 ;MEM-LO OF EDIT BUFFER MEMORY UMEMHI DS 2 ;MEM-HI OF EDIT BUFFER MEMORY EPOINT DS 2 ;POINTER TO ERROR WINDOW ; MPOINT DS 2 ;POINTER TO MACRO WINDOW COMC1 DS 1 ;COMMAND REPITION COUNTER COMC2 DS 1 ;HIGH BYTE OF COMMAND COUNTER TEMP9 DS 1 ;TEMP LOCATION TEMP10 DS 1 ;TEMP LOCATION TEMP11 DS 1 ;TEMP LOCATION MOVEF DS 2 ;MOVE SUBROUTINE POINTER MOVEL DS 2 ;MOVE SUBROUTINE POINTER MOVETO DS 2 ;MOVE SUBROUTINE POINTER BFIRST DS 2 ;BLOCK SUBROUTINES POINTER BLAST DS 2 ;BLOCK SUBROUTINES POINTER BNCHAR DS 2 ;BLOCK SUBROUTINES COUNTER BNLINE DS 2 ;BLOCK SUBROUTINES COUNTER BS1 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 1 BS2 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 2 BS3 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 3 BS4 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 4 BS5 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 5 BS6 DS 1 ;BLOCK-SEARCH TEMP VARIABLE 6 TEMP13 DS 1 ;TEMP VARIABLE TEMP14 DS 1 ;TEMP VARIABLE ; ; ; ORG $D4 ;MATH PACK ZERO PAGE DS 44 ;USES $D4 THRU $FF EJECT ; **** MACRO'S **** ; ; IF PROT ;ASSEMBLY IF PROTECTION WANTED MES MACRO MESNOF,MESCOF,MESLET LDY #%1 LDA NAME-1,Y CLC ADC #%2 CMP #%2+'%3' BEQ *+5 JMP (DOSVEC) ENDM ENDIF ; ; MIN256 EQU -256 LBYTE MACRO WORD DB [[HIGH %1]*MIN256]+%1 ENDM ; ; ADDWW MACRO DEST,OPERND LDA %1 CLC ADC %2 STA %1 LDA %1+1 ADC %2+1 STA %1+1 ENDM ; ADDWB MACRO DEST,OPERND LDA %1 CLC ADC %2 STA %1 LDA %1+1 ADC #0 STA %1+1 ENDM ; SUBWW MACRO DEST,OPERND LDA %1 SEC SBC %2 STA %1 LDA %1+1 SBC %2+1 STA %1+1 ENDM ; SUBWB MACRO DEST,OPERND LDA %1 SEC SBC %2 STA %1 LDA %1+1 SBC #0 STA %1+1 ENDM ; INCW MACRO LOCATION INC %1 BNE *+5 INC %1+1 NOP ENDM ; DECW MACRO LOCATION LDA %1 BNE *+5 DEC %1+1 NOP DEC %1 ENDM ; COPYW MACRO DEST,SOURCE LDA %2 STA %1 LDA %2+1 STA %1+1 ENDM ; MOVE MACRO FIRST,LAST,DEST COPYW MOVEF,%1 COPYW MOVEL,%2 COPYW MOVETO,%3 JSR BMOVE ENDM ; IFLT MACRO ACC,MEM,LABEL LDA %1 CMP %2 LDA %1+1 SBC %2+1 BCC %3 ENDM ; IFGT MACRO ACC,MEM,LABEL IFLT %2,%1,%3 ENDM ; IFEQ MACRO ACC,MEM,LABEL LDA %1 CMP %2 BNE *+10 LDA %1+1 CMP %2+1 BEQ %3 NOP NOP ENDM ; ;IFNE MACRO ACC,MEM,LABEL ; LDA ACC ; CMP MEM ; BNE LABEL ; LDA ACC+1 ; CMP MEM+1 ; BNE LABEL ; ENDM ; COPYWI MACRO DEST,SOURCE LDA #LOW %2 STA %1 LDA #HIGH %2 STA %1+1 ENDM ; PUSHCC MACRO LDA COMC1 PHA LDA COMC2 PHA ENDM ; PULLCC MACRO PLA STA COMC2 PLA STA COMC1 ENDM EJECT ; **** ROM DATA AREA **** ; ; ORG EDORG JMP BEGIN ;STARTUP VECTOR ; DEFALT DB 114 ;MAXIMINE LINE LENGTH (10-200) DB $80 ;SPACE TABS ($80), EXPANDING TABS ($00) DB 0,2,2,2,2,2,2,2,2,2 ;DEFAULT TABSTOPS DB 2,2,2,2,2,0,0,0,0,0 ;DEFAULT TABSTOPS DB 0,0,0,0,0,0,0,0,0,0 ;DEFAULT TABSTOPS DB 0 ;DEFAULT TABSTOPS DB $40 ;DEFALUT CASE LOCK ($00-NO LOCK, $40-CAPS, $80-CTRL) DB 3 ;DEFAULT LEFT MARGIN (2-39) DB 40 ;DEFAULT RIGHT MARGIN (2-40) DB $80 ;VIS-TAB-FLAG: SPACES ($80), TAB ($00) DB $80 ;VIS-CR-FLAG: SPACE ($00), DOWN-ARROW ($80) DB $94 ;COLOR OF SCREEN (AND'ED WITH $F7) DB $0A ;BRIGHTNESS OF CHARACTERS (OR'ED WITH $08) DB 100 ;MINIMUM GROWTH (0-255) DB $80 ;AUTO-INDENTION: OFF ($00), ON ($80) DEFLEN EQU *-DEFALT ; ATAINT DB $40,$00,$20,$60 MASKTB DB $01,$02,$04,$08 DB $10,$20,$40,$80 ; KEYTAB DB $1C ;CURSOR UP DB $1D ;CURSOR DOWN DB $1E ;CURSOR LEFT DB $1F ;CURSOR RIGHT DB $FE ;DELETE RIGHT DB $9C ;DELETE LINE DB $7D ;CLEAR ERROR WINDOW DB $FF ;RESERVED FOR FUTURE USE DB $9D ;INSERT LINE DB $FD ;CURSOR TO BEGINNING DB $9E ;TOGGLE VIS-TAB-MODE DB $9F ;TOGGLE VIS-CR-MODE DB $7F ;TAB KEYLEN EQU *-KEYTAB EJECT KEYROU DW EPCUS-1 ;CURSOR UP DW EPCDS-1 ;CURSOR DOWN DW EPCLS-1 ;CURSOR LEFT DW EPCRS-1 ;CURSOR RIGHT DW DELRS-1 ;DELETE RIGHT DW DELSL-1 ;DELETE LINE DW CEW-1 ;CLEAR ERROR WINDOW DW ARTS-1 ;RESERVED FOR FUTURE USE DW INSSL-1 ;INSERT LINE DW CURBL-1 ;CURSOR TO BEGINNING DW TOGVTB-1 ;TOGGLE VIS-TAB-MODE DW TOGVCR-1 ;TOGGLE VIS-CR-MODE DW EPITS-1 ;TAB ; ECOLON DB 'E:',CR ;OPEN EDITOR FILESPEC KCOLON DB 'K:',CR ;OPEN KEYBOARD FILESPEC PCOLON DB 'P:',CR ;OPEN PRINTER FILESPEC EJECT ASKFIL DB CR,'FILENAME IS ' FNPLEN EQU *-ASKFIL ; MARKER DB $80+'*',$80+'*',$80+'*',$80+'*',$A0,$A0 DB $80+'B',$80+'L',$80+'O',$80+'C',$80+'K',$A0,$A0 DB $80+'M',$80+'A',$80+'R',$80+'K',$80+'E',$80+'R' DB $A0,$A0,$80+'*',$80+'*',$80+'*',$80+'*',CR,'//' BMLEN EQU *-MARKER-2 EJECT ; **** ROM COMMAND TABLE **** ; ; CTAB DB $80 ;BLANK (NOP) DW ARTS DB ' ' DB $C0 ;CURSOR LEFT DW EPCCL DB 'CL' DB $C0 ;CURSOR RIGHT DW EPCCR DB 'CR' DB $C0 ;CURSOR UP DW EPCCU DB 'CU' DB $C0 ;CURSOR DOWN DW EPCCD DB 'CD' DB $80 ;CURSOR TO BEGINNING OF BUFFER DW CBBS DB 'CBB' DB $80 ;CURSOR TO END OF BUFFER DW CEBS DB 'CEB' DB $80 ;CURSOR TO BEGINNING OF FILE DW EPCBF DB 'CBF' DB $80 ;CURSOR TO END OF FILE DW EPCEF DB 'CEF' DB $80 ;CURSOR TO BEGINNING OF LINE DW CURBL DB 'CBL' DB $80 ;CURSOR TO END OF LINE DW EPCCEL DB 'CEL' DB $C0 ;CURSOR TO COLUMN N DW EPCCC DB 'CC' DB $C0 ;DELETE LINE DW COMDL DB 'DL' DB $C0 ;DELETE BEFORE CURSOR DW COMDB DB 'DB' DB $C0 ;DELETE AFTER CURSOR DW COMDA DB 'DA' DB $80 ;DELETE REMAINDER OF LINE DW EPCDR DB 'DR' DB $80 ;DELETE FIRST PART OF LINE DW EPCDF DB 'DF' DB $80 ;BLOCK COPY DW EPCBC DB 'BC' DB $80 ;BLOCK DELETE DW EPCBD DB 'BD' DB $80 ;BLOCK MOVE DW EPCBM DB 'BM' DB $80 ;BLOCK PRINT DW EPCBP DB 'BP' DB $81 ;BLOCK WRITE DW EPCBW DB 'BW' DB $81 ;BLOCK READ DW EPCBR DB 'BR' DB $80 ;MARKER SET DW EPCMS DB 'MS' DB $80 ;MARKER CLEAR DW EPCMC DB 'MC' DB $C0 ;PRINT LINES DW EPCPL DB 'PL' DB $C1 ;WRITE LINES TO DISK DW EPCWL DB 'WL' DB $80 ;INPUT HALF DW EPCIH DB 'IH' DB $C1 ;INPUT TEXT DW COMIT DB 'IT' DB $80 ;OUTPUT UPTO CURSOR DW WRITUC DB 'OC' DB $C1 ;SEARCH BUFFER DW EPCSB DB 'SB' DB $C1 ;SEARCH FILE DW EPCSF DB 'SF' DB $C3 ;SEARCH & REPLACE IN BUFFER DW EPCSRB DB 'SRB' DB $C3 ;SEARCH & REPLACE IN FILE DW EPCSRF DB 'SRF' DB $C3 ;SEARCH & REPLACE W/VERIFY IN BUFFER DW EPCSVB DB 'SRVB' DB $C3 ;SEARCH & REPLACE W/VERIFY IN FILE DW EPCSVF DB 'SRVF' DB $80 ;RECOVER LINE DW EPCRL DB 'RL' DB $C0 ;LEFT MARGIN SET DW EPLMS DB 'LM' DB $C4 ;RIGHT MARGIN SET DW EPRMS DB 'RM' DB $C0 ;EXIT NORMALLY DW NORMX DB 'EXIT' DB $C0 ;EXIT ABNORMALLY DW ABORTX DB 'ABORT' DB $80 ;REOPEN SAME FILE (BACKUP) DW EPCRE DB 'REOPEN' DB $C0 ;CONVERT TABS TO SPACES DW EPCCTS DB 'CTS' DB $80 ;END OF TABLE DW ARTS DB 'MIKE LORENZEN''S' DB $FF,$FF CTBLEN EQU *-CTAB EJECT ; **** ERROR TABLES **** ; ; MFERRT EQU *-5 DB 'MEMORY FUL',$80+'L' CEERRT EQU *-5 DB 'CURSOR AT EN',$80+'D' LLERRT EQU *-5 DB 'LINE TOO LON',$80+'G' IEERRT EQU *-5 DB 'INPUT EO',$80+'F' UDERRT EQU *-5 DB 'USING DEFAULT',$80+'S' IFERRT EQU *-5 DB 'ILLEGAL DEV:FILE.EX',$80+'T' NFERRT EQU *-5 DB 'NEW FIL',$80+'E' NOERRT EQU *-5 DB 'NUMBER TOO BI',$80+'G' SDERRT EQU *-5 DB 'DELIMITER ERRO',$80+'R' UNERRT EQU *-5 DB 'UNRECOGNIZED COMMAN',$80+'D' NCERRT EQU *-5 DB 'NOT COMPLET',$80+'E' EJECT FLERRT EQU *-5 DB 'FILE LOCKE',$80+'D' ECERRT EQU *-5 DB 'EDITOR IS CONFUSE',$80+'D' BAERRT EQU *-5 DB 'BREAK KEY ABOR',$80+'T' SFERRT EQU *-5 DB 'SEARCH FAILE',$80+'D' BIERRT EQU *-5 DB 'CANNOT - PREVIOUS I/O ERRO',$80+'R' CFERRT EQU *-5 DB 'CANNOT FIND MARKED BLOC',$80+'K' FFERRT EQU *-5 DB 'CANNOT FIND FIL',$80+'E' SPERRT EQU *-5 DB 'VERIFY (REPLACE,SKIP,QUIT)',$80+'?' MVERRT EQU *-5 DB 'MARGIN VALUE ERRO',$80+'R' IOERRT EQU *-5 DB 'I/O ERROR ' ERRNUM DB 0,0,0 ;REALLY DS 3 ; MFERRM EQU 0 ;MEMORY FULL ERROR CEERRM EQU 1 ;CURSOR AT END ERROR LLERRM EQU 2 ;LING TO LONG ERROR IEERRM EQU 3 ;INPUT EOF WARNING UDERRM EQU 4 ;NO TAB FILE WARNING IFERRM EQU 5 ;ILLEGAL FILENAME ERROR NFERRM EQU 6 ;NEW FILE WARNING NOERRM EQU 7 ;NUMERIC OVERFLOW ERROR DEERRM EQU 8 ;DELIMITER ERROR UNERRM EQU 9 ;UNRECOGIZED COMMAND ERROR NCERRM EQU 10 ;COMMAND NOT COMPLETE ERROR FLERRM EQU 11 ;FILE LOCKED ERROR ECERRM EQU 12 ;EDITOR CONFUSED ERROR BAERRM EQU 13 ;BREAK-ABORTED COMMAND SFERRM EQU 14 ;SEARCH FAILED BIERRM EQU 15 ;CANNOT - PREVIOUS DISK I/O ERROR CFERRM EQU 16 ;CANNOT FIND BLOCK MARKERS FFERRM EQU 17 ;CANNOT FIND FILE SPERRM EQU 18 ;SEARCH/REPLACE/VERIFY PROMPT MVERRM EQU 19 ;MARGIN VALUE ERROR IOERRM EQU 20 ;I/O ERROR NNN ERROR ; ERRTL LBYTE MFERRT ;MEMORY FULL LBYTE CEERRT ;CURSOR AT END LBYTE LLERRT ;LINE TO LONG LBYTE IEERRT ;INPUT EOF LBYTE UDERRT ;NO TAB FILE LBYTE IFERRT ;ILLEGAL DEV/FILE/EXT LBYTE NFERRT ;NEW FILE LBYTE NOERRT ;NUMERIC OVERFLOW LBYTE SDERRT ;DELIMITER LBYTE UNERRT ;UNRECOGIZED COMMAND LBYTE NCERRT ;COMMAND NOT COMPLETE LBYTE FLERRT ;FILE LOCKED LBYTE ECERRT ;EDITOR IS CONFUSED LBYTE BAERRT ;BREAK-ABORTED COMMAND LBYTE SFERRT ;SEARCH FAILED LBYTE BIERRT ;CANNOT - PREVIOUS DISK I/O ERROR LBYTE CFERRT ;CANNOT FIND BLOCK MARKERS LBYTE FFERRT ;CANNOT FIND FILE LBYTE SPERRT ;SEARCH/REPLACE VERIFY PROMT LBYTE MVERRT ;MARGIN VALUE ERROR LBYTE IOERRT ;I/O ERROR NNN ; ERRTH DB MFERRT/256 ;MEMORY FULL DB CEERRT/256 ;CURSOR AT END DB LLERRT/256 ;LINE TOO LONG DB IEERRT/256 ;INPUT EOF DB UDERRT/256 ;NO TAB FILE - USING DEFAULTS DB IFERRT/256 ;ILLEGAL DEV:FILE.EXT DB NFERRT/256 ;NEW FILE DB NOERRT/256 ;NUMERIC OVERFLOW DB SDERRT/256 ;DELIMETER DB UNERRT/256 ;UNRECOGNIZED COMMAND DB NCERRT/256 ;COMMAND NOT COMPLETE DB FLERRT/256 ;FILE LOCKED DB ECERRT/256 ;EDITOR IS CONFUSED DB BAERRT/256 ;BREAK-KEY ABORT DB SFERRT/256 ;SEARCH FAILED DB BIERRT/256 ;CANNOT - PREVIOUS DISK I/O ERROR DB CFERRT/256 ;CANNOT FIND MARKED BLOCK DB FFERRT/256 ;CANNOT FIND FILE DB SPERRT/256 ;SEARCH/REPLACE VERIFY PROMPT DB MVERRT/256 ;MARGIN VALUE ERROR DB IOERRT/256 ;I/O ERROR NNN ; FSMESG DB 125,'WARNING - LIMITED FREE SPACE',CR,CR,CR DB 'SOURCE FILE SIZE ' EJECT SIZASC DB 0,0,0,0,0 ;DS 5 DB CR,'FREE SPACE ' FREASC DB 0,0,0,0,0 ;DS 5 DB CR,CR,CR,CR,$80+'P',$80+'R',$80+'E',$80+'S',$80+'S' DB ' ',$80+'A',' TO ABORT, ',$80+'I',' TO IGNORE',CR,CR,CR FSMLEN EQU *-FSMESG ; FULMES DB 125,'EDITOR CANNOT RUN - NO FREE IOCB''S',CR DB CR,CR,$80+'P',$80+'R',$80+'E',$80+'S',$80+'S',' ' DB $80+'S',$80+'T',$80+'A',$80+'R',$80+'T',' TO RETURN TO DOS',CR,CR,CR FULLEN EQU *-FULMES EJECT SIGNON DB 125,CR,CR,CR,CR,' PROGRAM-TEXT EDITOR' DB CR,CR,CR,CR,' Version 1.0' DB CR,' For Dos 2.0' DB CR,CR,CR,CR,CR,CR,CR,CR DB CR,CR,CR,CR,CR,CR,' Copyright 1981, ATARI' SOMLEN EQU *-SIGNON EJECT ; **** SCREEN CURSOR LEFT (UP) ROUTINES **** ; ; EPCLS LDA #0 ;ENTRY POINT TO "SCREEN CURSOR LEFT" ROUTINE JMP SLUI ;MOVE LEFT & EXIT ; EPCUS LDA LINSIZ ;ENTRY POINT TO "SCREEN CURSOR UP" ROUTINE STA CDCNTR ;CURSOR UP IS KINDA LIKE CURSOR-LEFTING N TIMES JSR SLUI ;MOVE UP BY LEFTING JMP CUS2 CUS1 JSR SLU ;MOVE UP BY LEFTING CUS2 DEC CDCNTR BNE CUS1 RTS ; EPCCL ;ENTRY POINT TO "COMMAND CURSOR LEFT" ROUTINE LDA #0 JSR SLUI ;MOVE LEFT JMP CCL2 CCL1 JSR SLU ;MOVE LEFT CCL2 BIT ATREAL ;"COMAND CURSOR LEFT" CAN'T STOP INSIDE TAB OR CR BPL CCL1 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CCL1 ;BRANCH BACK IF NOT ZERO RTS ; EPCCU ;ENTRY POINT TO "COMMAND CURSOR UP" ROUTINE JSR CURBL ;MOVE CURSOR TO LEFT MARGIN LDA #1 JSR SLUI ;MOVE UP JMP CCU2 CCU1 JSR SLU ;MOVE UP CCU2 LDA SAVLOG BNE CCU1 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CCU1 ;BRANCH BACK IF NOT ZERO RTS ; EPBP LDA #1 ;ENTRY POINT "SCREEN CURSOR TO BEGINNING OF PHYS. LINE CMP COLCUR ;EXIT IF ALREADY AT LEFT MARGIN BEQ CBPL3 STA CDFLAG JSR SLUI ;MOVE LEFT JMP CBPL2 CBPL1 JSR SLU ;MOVE LEFT CBPL2 LDA COLCUR CMP #1 ;REPEAT UNTIL AT LEFT MARGIN BNE CBPL1 CBPL3 RTS ; SLUI STA CDFLAG ;SAVE ACTION TO TAKE -- CURSOR LEFT OR CURSOR UP BIT ATREAL ;IS SCREEN CURSOR AT REAL OR IMAG. LOCATION BMI Y1 ;BRANCH IF AT REAL JSR WHATCL ;DETERMINE LOGICAL COLUMN AFTER LEFT CHARACTER SLU BIT ATREAL ;IS SCREEN CURSOR AT REAL OR IMAG. LOCATION BMI Y1 ;BRANCH IF AT REAL LDX TEMP6 ;RECOVER "JSR WHATCL" INFO STX TEMP3 LDY #0 LDA (L3),Y ;FETCH CHAR. RIGHT OF MEMORY CURSOR CMP #CR ;TEST IF IMAG. CR. OR IMAG. TAB BEQ Y2 ;BRANCH IF IMAG. CR. ; Y8 LDA CDFLAG BEQ Y19 DEC SAVLOG ;MOVE BACK 1 COLUMN OF TAB LDA #1 CPX SAVLOG BEQ Y11 ;MAKE REAL STY ATREAL ;MAKE IMAG BNE Y13 Y19 LDA SAVLOG ;IN MIDDLE OF IMAG. TAB - SO SKIP OVER SEC SBC TEMP3 Y11 STX SAVLOG ;NEW LOGICAL COLUMN TAX ;CALC HOW MANY PLACES TO MOVE SCREEN CURSOR Y3 JSR MOVSCL ;MOVE SCREEN CURSOR LEFT 1 POSITION DEX BNE Y3 Y16 LDA #$80 STA ATREAL ;MAKE REAL BNE Y4 ; Y2 DEC SAVLOG ;IN MIDDLE OF IMAG. CR - SO BACKUP 1 COLUMN JSR MOVSCL ;MOVE SCREEN CURSOR LEFT 1 POSITION CPX SAVLOG ;TEST IF BECOMES REAL BNE Y4 ;BRANCH IF STAYS IMAG. BEQ Y16 ;BRANCH IF BECOMES REAL ; Y1 LDA L1+1 ;IF AT-REAL AND (L1EQUL2EQU0) THEN CURSOR END ERROR BNE Y18 LDY #CEERRM JMP DISERR Y18 JSR CURLM LDY #0 LDA (L3),Y ;WHAT TYPE OF CHAR IS TO THE LEFT CMP #CR BEQ Y6 ;BRANCH IF CR BIT TABFAK ;TEST FOR TAB ONLY IF TABS ARE REAL-TABS BMI Y7 ;TABS ARE NORMAL CHARS CMP #TAB BNE Y7 ;MUST BE A NORMAL CHAR. JSR WHATCL JMP Y8 ;JUMP ; Y6 EQU * JSR WHATCL LDA TEMP3 ;MOVE INTO IMAG. CR Y22 CMP LINSIZ BCC Y10 SBC LINSIZ JMP Y22 ; Y10 STA TEMP3 LDA LINSIZ SBC TEMP3 STX TEMP5 BNE Y12 LDY #$80 Y12 STY ATREAL CLC ADC TEMP5 STA SAVLOG JMP Y13 ; Y7 DEC SAVLOG ;BACKUP 1 COLUMN FOR NORMAL CHARACTER Y13 JSR MOVSCL ;MOVE SCREEN CURSOR LEFT 1 POSITION ; Y4 RTS ; MOVSCL LDA COLCUR ;CALC IF ROOM ON SCREEN TO CURSOR LEFT CMP #1 BEQ Y15 ;HAVE TO MOVE UP TO MOVE LEFT DEC COLCUR RTS ;MOVE SCREEN CURSOR LEFT 1 POS. IN SIMPLEST CASE Y15 LDA LINSIZ STA COLCUR ;CURSOR NOW AT RIGHTMOST EDGE LDA ROWCUR CMP #1 BEQ Y17 ;BRANCH IF HAVE TO BRING LINE NOT ON SCREEN DEC ROWCUR RTS ; Y17 LDA L2+1 ;CHECK IF AUTO-SCROLL TO FIRST LINE OF BUFFER WHICH BNE Y23 ;ONLY HAS A CR - BRANCH IF NOT THE CASE ; COPYW BEGDIS,L3 ;POINT BEGINNING OF DISPLAY TO NO-TEXT BEFORE CURSOR RTS ; Y23 STX TEMP7 ;SAVE X-REG JSR FINLCR ;FIND LAST CR BEFORE CURSOR LDA SAVLOG ;SCROLL DOWN 1 LINE SEC SBC LINSZ3 STA TEMP5 BEQ Y21 ;AT BEGINNING OF LINE - CALC CR + 1 JSR WHATC2 JMP Y14 Y21 JSR WHATC3 Y14 LDX TEMP7 ;RECOVER X-REG STX TEMP6 RTS EJECT ; **** SCREEN CURSOR RIGHT (DOWN) ROUTINES **** ; ; EPCRS LDA #0 ;ENTRY POINT FOR "SCREEN CURSOR RIGHT" ROUTINE STA CDFLAG ;TELL SRD TO SKIP OVER TABS JMP SRD ;DO IT & EXIT ; EPCDS LDA LINSIZ ;ENTRY POINT FOR "SCREEN CURSOR DOWN" ROUTINE STA CDCNTR ;CURSOR DOWN IS KINDA LIKE N CURSOR RIGHTS STA CDFLAG ;TELL SRD TO NOT SKIP OVER TABS CDS1 JSR SRD ;DO IT DEC CDCNTR BNE CDS1 ;BRANCH BACK UNTIL COMPLETED 1 CURSOR DOWN RTS ; EPCCR ;ENTRY POINT FOR "SCREEN CURSOR RIGHT" ROUTINE LDA #0 ;ZERO TIMES IS MADE INTO ONE TIME STA CDFLAG ;TELL SRD TO SKIP OVER TABS CCR1 JSR SRD ;DO IT BIT ATREAL BPL CCR1 ;BRANCH UNTIL CURSOR AT REAL PLACE JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CCR1 ;BRANCH BACK UNTIL REPEAT COUNTER ZERO RTS ; EPCCD ;ENTRY POINT FOR "COMMAND CURSOR DOWN" ROUTINE JSR CURBL ;MOVE CURSOR TO LEFT MARGIN CCD1 JSR EPCDS ;CURSOR DOWN ONE PHYSICAL LINE LDA SAVLOG BNE CCD1 ;BRANCH BACK UNTIL AT BEGINNING OF NEW LINE JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CCD1 ;BRANCH BACK UNTIL REPEAT EQU ZERO RTS ; SRD LDA L4+1 ;IF (L3EQUL4EQU0) THEN CAN'T GO RIGHT OR DOWN BNE X1 LDY #CEERRM ;"CURSOR AT END" ERROR JMP DISERR ;DISPLAY MESSAGE & EXIT ; X1 LDY #0 ;FETCH CHAR. RIGHT OF CURSOR LDA (L3),Y CMP #CR BEQ X10 ;BRANCH IF IMAG. CR BIT TABFAK ;ARE TABS REAL OR NORMAL CHARS. BMI X9 ;BRANCH IF TAB IS NORMAL PRINTING CHAR. CMP #TAB ;TEST IF IMAG. TAB BEQ X2 ;BRANCH IF IMAG. TAB BNE X9 ;BRANCH IF NORMAL CHARACTER ; X10 LDA SAVLOG ;COPY LOGCOL TO TEMP VARIABLE STA TEMP1 ; X7 CMP LINSZ3 ;CALC IF MORE IMAG. CR. POSITIONS EXIST BEQ X4 ;BRANCH IF SCR. CURSOR BECOMES REAL BCC X5 ;BRANCH IF SCR. CURSOR STAYS IMAGINARY ; LDA TEMP1 ;SUBTRACT PHYS. LINE LENGTH & TRY AGAIN SEC SBC LINSIZ STA TEMP1 BCS X7 ;JUMP ; X4 STY SAVLOG ;CURSOR AT NEW LINE - MAKE REAL LDA #$80 STA ATREAL ;MAKE REAL BNE X11 ;JUMP ; X5 INC SAVLOG ;SAVLOG EQU SAVLOG + 1 STY ATREAL ;MAKE IMAGINARY BNE X13 ;JUMP ; X2 JSR CURRM ;WERE STARTING OR ALREADY IN A TAB X8 JSR MOVSCR ;MOVE SCREEN CURSOR INC SAVLOG ;SAVLOG EQU SAVLOG + 1 CLC LDA #1 ADC SAVLOG ;TEMPORARILY SAVLOG EQU SAVLOG + 1 JSR BITGET ;LOOK FOR TABSTOP AT NEXT COLUMN LDA CDFLAG ;TEST IF CR OR CD BNE X18 ;BRANCH IF CD BCC X8 ;CR - NOT AT TABSTOP SO LOOP UNTIL X18 BCC X12 ;BRANCH IF CD NOT AT TABSTOP ; LDA #$80 ;CR OR CD AND AT TABSTOP STA ATREAL ;MAKE REAL BNE X19 ;JUMP ; X12 JSR CURLM ;CD NOT AT TABSTOP - STILL IMAG SO ADJUST STY ATREAL ;MAKE IMAGINARY JMP X19 ; X9 INC SAVLOG ;LOGCOL EQU LOGCOL + 1 ; X11 JSR CURRM ;MOVE MEMORY CURSOR RIGHT X13 JSR MOVSCR ;MOVE SCREEN CURSOR RIGHT 1 POSITION X19 RTS ; ; ; ; MOVSCR LDA COLCUR ;ROOM ON PHYS. LINE FOR CURSOR RIGHT ? CMP LINSIZ BCS X15 ;BRANCH IF NO ROOM & HAVE TO GO TO NEXT LINE INC COLCUR ;SIMPLE SCREEN CURSOR RIGHT BPL X16 ;JUMP ; X15 LDA ROWCUR ;IF AT LAST LINE & LAST COLUMN -- BIG TROUBLE CMP #20 BNE X17 ;BRANCH IF ANOTHER LINE ALREADY ON SCREEN ; LDA BEGCOL ;SCROLL UP 1 LINE CLC ADC LINSIZ STA TEMP5 LDA BEGDIS STA TEMP1 LDA BEGDIS+1 STA TEMP2 LDY #0 JSR FINLC3 ;FIND LAST CR BEFORE 1ST POSITION OF DISPLAY JSR WHATC2 ;CALC WHERE & ESTABLISH: BEGDIS, BEGCOL, BEGTFG DEC ROWCUR ;STAY ON ROW 20 ; X17 LDA #1 ;SET CURSOR COLUMN TO 1 STA COLCUR INC ROWCUR ;EXCEEDED PHYSICAL LINE - ADVANCE TO NEXT ; X16 RTS EJECT ; **** MOVE CURSOR TO BEGINNING OF BUFFER **** ; ; CBBS JSR CBBM ;CURSOR TO BEGINNING OF BUFFER JSR EPHPT ;HOME MISC. POINTERS ; LDA L1+1 ;WHERE STARTS DISPLAY BEQ CBBS1 ;BRANCH IF NOTHING IN BUFFER ; LDY L1 JMP CBBS2 ; CBBS1 LDA BEGFRE+1 ;START WITH NEXT CHARACTER ENTERED LDY BEGFRE ; CBBS2 STA BEGDIS+1 STY BEGDIS RTS ; ; ; ; ; ; **** MOVE CURSOR TO END OF BUFFER **** ; ; CEBS JSR CEBM JSR EPHPT ;HOME MISC. POINTERS LDA BEGFRE ;SCREEN WILL START WITH NEXT INSERTED CHARACTER STA BEGDIS LDA BEGFRE+1 STA BEGDIS+1 RTS EJECT ; **** MOVE CURSOR TO BEGINNING OF FILE **** ; ; EPCBF BIT VIRGIN ;ENTRY POINT FOR "CURSOR TO BEGINNING OFFILE" ROUTINE BPL CBF1 ;BRANCH IF OUTPUT FILE HAS BEEN ALREADY WRITTEN TOO JMP CBBS ;STILL IN FIRST BUFFER - JUST GO TO THE BEGINNING CBF1 JMP EPCRE ;MUST DO A REOPEN TO GET TO THE BEGINNING ; ; ; ; ; **** MOVE CURSOR TO END OF FILE **** ; ; EPCEF JSR CEBS ;ENTRY POINT FOR "CURSOR TO END OF FILE"ROUTINE BIT EOFLAG BMI CEF1 ;BRANCH IF AT END-OF-FILE JSR WRITUC ;WRITE OUT CURRENT BUFFER JSR EPCIH ;READ BUFFER JMP EPCEF ;AGAIN CEF1 RTS EJECT ; **** MOVE CURSOR TO BEGINNING OF LINE **** ; ; CURBL LDA SAVLOG ;TEST IF ALREADY BEGINNING OF LINE BEQ CURBL6 ; LDY #0 ;MOVE L2 & L3 TO BEGINNING OF LINE CURBL1 LDA (L2),Y CMP #CR BEQ CURBL2 JSR CURLM LDA L1+1 ;TRY AGAIN UNLESS AT BEGINNING OF BUFFER BNE CURBL1 ;TRY AGAIN ; CURBL2 LDA SAVLOG ;MOVE SCREEN CURSOR TO BEGINNING CURBL3 CMP LINSIZ BCC CURBL5 ;CURSOR WILL STAY ON THIS LINE SBC LINSIZ LDX ROWCUR CPX #1 BEQ CURBL4 ;BRANCH IF CURSOR OFF SCREEN DEC ROWCUR BNE CURBL3 ; CURBL4 LDA BEGFRE ;DISPLAY SCROLLS TO INCLUDE THE BEGINNING OF THIS LINE STA BEGDIS LDA BEGFRE+1 STA BEGDIS+1 STY BEGTFG STY BEGCOL ; CURBL5 STY SAVLOG ;CURSOR AT LOGICAL COLUMN ZERO INY STY COLCUR LDA #$80 STA ATREAL CURBL6 RTS EJECT ; **** MOVE CURSOR TO END OF LINE **** ; ; EPCCEL LDA L3+1 ;ENTRY POINT TO "MOVE CURSOR TO END OF LINE" ROUTINE BEQ CCEL3 ;BRANCH IF NO TEXT TO RIGHT ; CCEL1 LDY #0 LDA (L3),Y ;WHAT CHARACTER TO RIGHT ? BIT ATREAL ;AT REAL OR IMAGINARY PLACE ? BMI CCEL2 ;BRANCH IF AT REAL PLACE ; CMP #TAB BEQ CCEL2 ;IF INSIDE OF TAB - MOVE TO RIGHT JSR EPCLS ;PAST END OF LINE - MOVE TO LEFT JMP CCEL1 ; CCEL2 CMP #CR BEQ CCEL3 ;BRANCH IF AT END OF LINE JSR EPCRS ;MOVE TO RIGHT JMP CCEL1 ; CCEL3 RTS EJECT ; **** CURSOR TO COLUMN N ROUTINE **** ; ; EPCCC LDA COMC2 ;ENTRY POINT FOR "CURSOR TO COLUMN N" ROUTINE BNE CCC1 ;BRANCH IF COLUMN REQUESTED MUCH TOO BIG DEC COMC1 ;RANGE SHOULD BE 1--1 NOT 0--(N-1) OOPS LDA COMC1 CMP COLLMT BCC CCC2 ;BRANCH IF COLUMN REQUESTED REASONABLE CCC1 LDY #NOERRM ;DISPLAY "TOO BIG NUMBER" ERROR & EXIT JMP DISERR ; CCC2 LDY #0 ;IF CURSOR IS INSIDE IMAGINARY CR THEN MOVE.... LDA (L3),Y ;...CURSOR TO THE END OF LINE CMP #CR BNE CCC3 ;BRANCH IF CHAR. TO RIGHT NOT CR BIT ATREAL BMI CCC3 ;BRANCH IF CURSOR IS BEFORE CR JSR EPCCEL ;DO THE "CEL" ; CCC3 LDA SAVLOG ;WHICH WAY TO GO OR EXIT CMP COMC1 BEQ CCC7 ;WERE THERE - EXIT BCS CCC5 ;BRANCH IF MUST GO TO THE LEFT ; LDA (L3),Y ;MOVE TO THE RIGHT CMP #CR BNE CCC4 ;BRANCH IF NOT AT END OF EXISTING LINE LDA #' ' JSR INSSC ;INSERT A BLANK(S) UNTIL AT DESIRED COLUMN JMP CCC3 ;CHECK IF DONE ; CCC4 LDA #01 ;CURSOR RIGHT (COLUMN BY COLUMN) STA CDFLAG JSR SRD ;DO THE CURSOR RIGHT JMP CCC3 ;CHECK IF DONE ; CCC5 LDA #01 ;MOVE TO THE LEFT JSR SLUI ;CURSOR LEFT (COLUMN BY COLUMN) CCC6 LDA SAVLOG ;TEST IF DONE CMP COMC1 BEQ CCC7 ;BRANCH IF DONE JSR SLU ;CURSOR LEFT UNTIL AT DESIRED COLUMN JMP CCC6 ; CCC7 RTS EJECT ; **** DELETE LOGICAL LINE CURSOR IS ON ROUTINE **** ; COMDL ;ENTRY POINT FOR "COMMAND DELETE LINE" ROUTINE COMDL1 JSR DELSL JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS COMDL1 ;BRANCH BACK IF NOT ZERO RTS ; ; DELSL JSR CURBL ;MOVE TO BEGINNING OF LINE LDA L3+1 ;SAVE LINE TO DELETE IN RECOVER-LINE-BUFFER BEQ DELSL3 ;BRANCH IF NULL LINE LDY #$FF DELSL4 INY LDA (L3),Y ;GET CHARACTER STA RLBUFR,Y ;SAVE CHARACTER CMP #CR BNE DELSL4 ;BRANCH BACK UNTIL ENTIRE LINE COPIED ; DELSL5 LDY #0 DELSL1 LDA L4+1 ;TEST (L3EQUL4EQU0) BEQ DELSL3 ;BRANCH IF NOTHING TO DELETE LDA (L3),Y ;DELETE LINE CMP #CR BEQ DELSL2 ;BRANCH IF FOUND ENDING CR JSR DELRM ;DELETE NEXT CHARACTER JMP DELSL1 ; DELSL2 JMP DELRM ;DELETE FINAL CR AND EXIT ; DELSL3 LDY #CEERRM JMP DISERR ;NOTHING TO DELETE -- CURSOR AT END ERROR EJECT ; **** DELETE SCREEN LEFT ROUTINE **** ; COMDB ;ENTRY POINT FOR "COMMAND DELETE BEFORE"ROUTINE COMDB1 JSR DELLS BIT ATREAL BPL COMDB1 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS COMDB1 ;BRANCH BACK IF NOT ZERO RTS ; ; DELLS LDA L4+1 ;IF (L1EQUL2EQU0) THEN CAN'T DELETE LEFT BEQ DELLE ;BRANCH IF NOTHING TO DELETE LDA L1+1 BNE DELLSY ;BRANCH IF NOT SPECIAL CASE **** ADDED *********************************************************************** BIT ATREAL BPL DELLSY ********************************************************************************** DELLE LDY #CEERRM JMP DISERR ;NOTHING TO DELETE -- CURSOR AT END ERROR ; DELLSY LDY #0 BIT ATREAL ;TEST IF AT REAL OR IMAGINARY PLACE BMI DELLS4 ;BRANCH IF AT REAL PLACE LDA (L3),Y ;FETCH IMAGINARY CHARACTER CMP #TAB BNE DELLS1 ;BRANCH IF IMAG. CR ; JMP DELRS ;DELETE IMAG. TAB ; DELLS1 JSR EPCLS ;HOW DELETE IMAGINARY CR ?? BIT ATREAL BPL DELLS8 ;IF AFTER CURSOR LEFT IT IS STILL IMAG. - EXIT JSR DELRS1 ;DELETE CR IF CAN CATENATE BOTH LINES BCC DELLS8 ;CR DELETED AND LINES CONCATENATED JSR EPCRS ;LINE TOO LONG -- NOP JMP EPACL ;ABORT COMMAND LINE (IF COMMAND MODE) ; DELLS4 LDA (L2),Y ;FETCH CHAR. TO DELETE CMP #CR BEQ DELLS7 ;BRANCH IF CR ; BIT TABFAK BMI DELLS6 ;BRANCH IF TABS ARE FAKE CMP #TAB BNE DELLS6 ;BRANCH IF REGULAR CHAR ; JSR EPCLS ;ITS A TAB JMP DELRM ;CURSOR LEFT & DELETE RIGHT ; DELLS6 DEC SAVLOG ;NORMAL CHARACTER -- JUST BACKUP 1 JSR MOVSCL JMP DELLM ;DELETE CHARACTER & EXIT ; DELLS7 JSR EPCLS ;CURSOR LEFT TO ABOVE LINE TO AUTO-SCROLL JSR EPCCEL ;MOVE CURSOR TO END OF LINE JSR DELRS1 ;TRY TO DELETE THE CR BCC DELLS8 ;SUCCESSFULL - ALL DONE ; JSR CURBL ;MOVE CURSOR TO BEGINNING OF ABOVE LINE DLLS1 JSR EPCDS ;CURSOR DOWN 1 PHYSICAL LINE LDA SAVLOG BNE DLLS1 ;GET BACK TO BEGINNING OF CURRENT LINE JMP EPACL ;ABORT COMMAND ; DELLS8 RTS EJECT ; **** DELETE SCREEN RIGHT ROUTINES **** ; COMDA ;ENTRY POINT FOR "COMMAND DELETE AFTER (RIGHT)" ROUTINE COMDA1 JSR DELRS BCS COMDA2 ;BRANCH IF ERROR IN DELETION BIT ATREAL BPL COMDA1 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS COMDA1 ;BRANCH BACK IF NOT ZERO RTS ; COMDA2 JMP EPACL ;ABORT COMMAND LINE - COULD NOT DELETE ; ; DELRS LDA L4+1 ;TEST IF (L3EQUL4EQU0) BEQ DELRSN ;NOTHING TO DELETE ERROR ; LDY #0 BIT ATREAL ;IS CURSOR REAL OR IMAGINARY BMI DELRS3 ;BRANCH IF AT REAL LDA (L3),Y ;FETCH CHAR TO BE DELETED CMP #CR BEQ DELRSR ;BRANCH TO DELETE IMAGINARY CR ; JSR EPCLS ;DELETE IMAGINARY TAB -- CURSOR LEFT JMP DELRM ;THEN DELETE RIGHT ; DELRSR LDA SAVLOG ;IMAGINARY CR-- CURSOR RIGHT, DELETE, CURSOR LEFT DELRS5 CMP LINSZ3 BEQ DELRS6 ;BRANCH TO DELETE 1ST CHAR OF NEXT LINE BCC DELRS7 ;BRANCH TO CURSOR-RIGHT INSIDE IMAG. CR SBC LINSIZ BCS DELRS5 ;TRY AGAIN ; DELRS6 JSR EPCRS ;MOVE POINTER SO DELETE 1ST CHAR. OF NEXT LINE LDA L4+1 BEQ DELRS8 ;BRANCH IF AT END OF BUFFER (NOTHING TO DELETE) JSR DELRSX ;DELETE CHARACTER JMP EPCLS ;CURSOR LEFT TO MAINTAIN NO CURSOR MOVEMENT ; DELRS7 JMP EPCRS ;IN MIDDLE OF IMAG. CR -- JUST CURSOR RIGHT ; DELRS3 LDA L3+1 ;IF (L3EQUL4EQU0) THEN NOP BEQ DELRSN ;BRANCH IF NOTHING TO DELETE ; LDA (L3),Y ;FETCH CHARACTER TO BE DELETED CMP #CR BNE DELRSX ;BRANCH IF ANYTHING BUT CR TO RIGHT ; DELRS1 JSR WHATCL ;HOW MANY COLUMNS IN PRESENT LINE STX TEMP7 ;SAVE COLUMN FOR DELETE LEFT OVER CR JSR DELRM ;DELETE CR SO DOES NOT AFFECT COLUMN COUNTING LDA L4+1 ;IF DELETED LAST CR IN BUFFER THEN PUT IT BACK BNE DELRS4 ;BRANCH IF THERE IS STILL TEXT AFTER CURSOR LDA #CR JSR INSRM ;PUT BACK THE CR JMP DELRSN ;SAY CURSOR AT END & EXIT ; DELRS4 JSR FINNCL ;FIND NEXT CR & SETUP FOR COUNT ; ; CPX COLLMT BCS DELRS2 ;>EQU THAN LIMIT -- CAN'T OBEY RTS ; DELRS2 LDA #CR ;REPLACE MISSING CR BECAUSE CANNOT DELETE IT JSR INSRM JMP DELRSC ; DELRSX JSR DELRM ;ADJUST MEMORY POINTERS CLC RTS ; DELRS8 JSR EPCLS ;RESTORE CURSOR TO ORIGINAL PLACE DELRSN LDY #CEERRM BNE DELRSE ;NOTHING TO DELETE -- CURSOR AT END ERROR DELRSC LDY #LLERRM ;LINE TO LONG ERROR DELRSE JSR DISOER SEC RTS EJECT ; **** DELETE FIRST PART OF LINE ROUTINE **** ; ; EPCDF LDA SAVLOG ;ENTRY POINT FOR "DELETE FIRST PART OF LINE" ROUTINE BEQ CDF1 ;BRANCH IF AT BEGINNING OF LINE ; JSR DELLS ;DELETE CHARACTER TO LEFT JMP EPCDF ;REPEAT UNTIL AT BEGINNING OF LINE ; CDF1 RTS EJECT ; **** DELETE REMAINDER OF LINE ROUTINE **** ; ; EPCDR LDA L4+1 ;ENTRY POINT TO "DELETE REMAINDER OF LINE" ROUTINE BEQ CDR2 ;BRANCH IF NOP BECAUSE NO TEXT TO RIGHT LDY #0 LDA (L3),Y ;GET CHARACTER TO RIGHT CMP #CR BNE CDR1 ;BRANCH IF NOT A CR BIT ATREAL BMI CDR1 ;BRANCH IF CURSOR AT REAL LOCATION JMP EPCCEL ;ITS INSIDE IMAGINARY CR - SO DO A "CEL" ; CDR1 LDY #0 LDA (L3),Y ;GET CHARACTER TO RIGHT CMP #CR BEQ CDR2 ;IF FOUND CR THEN DONE JSR DELRS ;DO A "DELETE RIGHT" JMP CDR1 ;DO UNTIL AT CR (EOL) ; CDR2 RTS EJECT ; **** BLOCK COPY **** ; ; EPCBC JSR EPHL ;ENTRY POINT FOR "BLOCK COPY" ROUTINE JSR EPDB LDA BNCHAR CMP #BMLEN*2 BNE CBC0 LDA BNCHAR+1 BNE CBC0 RTS ;EXIT IF NULL BLOCK TO COPY ; CBC0 JSR EPBRAM ;INSURE BLOCK WILL FIT-FREE AREA ADDWB BFIRST,#BMLEN ;SET BFIRST TO POINT TO BEGINNING OF BLOCK COPY SUBWB BLAST,#BMLEN ;SET BLAST TO POINT TO END OF BLOCK TO COPY JSR EPWHB BNE CBC1 ;BRANCH IF BLOCK IS IN BOTH L1-L2 & L3-L4 ; MOVE BFIRST,BLAST,BEGFRE ;MOVE BLOCK FROM L1-L2 OR L3-L4 JMP CBC2 CBC1 MOVE BFIRST,L2,BEGFRE ;MOVE 1ST HALF OF BLOCK COPYW TEMP1,L2 SUBWW TEMP1,BFIRST INCW TEMP1 ADDWW TEMP1,BEGFRE MOVE L3,BLAST,TEMP1 ;MOVE 2ND HALF OF BLOCK CBC2 SUBWB BNCHAR,#BMLEN*2 ;DON'T COUNT CHARACTERS IN MARKERS LDA L2+1 BNE CBC3 COPYW L1,BEGFRE COPYW L2,BEGFRE DECW L2 CBC3 ADDWW BEGFRE,BNCHAR ADDWW L2,BNCHAR ;L2=(L2+SIZE OF BLOCK) RTS EJECT ; ; ; ; ; **** BLOCK DELETE **** ; ; EPCBD JSR EPHL ;ENTRY POINT FOR "BLOCK DELETE" ROUTNE JSR EPDB ;DEFINE BLOCK, HOME LINE CURSOR IS ON JSR EPWHB ;DETERMINE WHICH BUFFER BLOCK IS IN L1-L2,L3-L4 BCS CDB1 ;BRANCH IF BLOCK IS IN L3-L4 BEQ CDB0 ;BRANCH IF BLOCK IS IN L1-L2 JMP CDB2 ;JUMP, BLOCK IS IN BOTH ; CDB0 INCW BLAST; ;BLOCK IS BETWEEN L1-L2 ; MOVE BLAST,L2,BFIRST; COLLAPSE AREA BLOCK WAS IN ; SUBWW L2,BNCHAR; L2EQUL2-(#CHAR-IN-BLOCK) ; SUBWW BEGFRE,BNCHAR; BEGFREEQUBEGFRE-(#CHAR-IN-BLOCK) ; JSR EPL1L2 ;IF L2L4 THEN L3EQUL4EQU0 ;COPYW BEGDIS,L3; POINT SCREEN TO CURSOR ********************************************************************************* JMP DBG01 ******************************************************************************** ; CDB2 COPYW BEGFRE,BFIRST; CURSOR INSIDE BLOCK DECW BFIRST; COPYW L2,BFIRST; JSR EPL1L2 ;DELETE TEXT BEFORE CURSOR COPYW ENDFRE,BLAST; INCW BLAST; COPYW L3,BLAST; JSR EPL3L4 ;DELETE TEXT AFTER CURSOR DBG01 COPYW BEGDIS,BEGFRE ;POINT TO CURSOR RTS EJECT ; ; ; ; ; **** BLOCK MOVE **** ; ; CBM3 LDY #DEERRM JMP DISERR ;CAN'T MOVE BLOCK TO INSIDE BLOCK ; ; EPCBM JSR EPHL ;ENTRY POINT FOR "BLOCK MOVE" ROUTINE JSR EPDB ;HOME LINE CURSOR IS ON - DEFINE BLOCK JSR EPBRAM ;TEST IF ENOUGH FREE RAM JSR EPWHB ;WHERE IS THE BLOCK BNE CBM3 ;CURSOR INSIDE BLOCK - ILLEGAL FOR BM PHP ; MOVE BFIRST,BLAST,BEGFRE; MOVE BLOCK TO FREE RAM AREA ; PLP BCS CBM1 ;BRANCH IF BLOCK IS IN L3-L4 ; INCW BLAST; ;BLOCK IS BETWEEN L1-L2 ; MOVE BLAST,L2,BFIRST; COLLAPSE AREA WHERE BLOCK USED TO BE ; COPYW TEMP1,BEGFRE; ADDWW TEMP1,BNCHAR; DECW TEMP1; ; COPYW TEMP3,L2; SUBWW TEMP3,BNCHAR; INCW TEMP3; ; MOVE BEGFRE,TEMP1,TEMP3; COLLAPSE AREA BLOCK WAS IN CBM0 RTS CBM1 LDA L1+1 BNE CBM2 ; COPYW L1,BEGFRE; COPYW L2,BEGFRE; DECW L2; CBM2 ADDWW L2,BNCHAR; ; DECW BFIRST; ; COPYW TEMP1,L3; ; ADDWW L3,BNCHAR; L3EQUL3+(#CHAR-IN-BLOCK) ; MOVE TEMP1,BFIRST,L3; MOVE BLOCK BEFORE CURSOR ; ADDWW BEGFRE,BNCHAR; BEGFREEQUBEGFRE+(#CHAR-IN-BLOCK) ; ADDWW ENDFRE,BNCHAR; ENDFREEQUENDFRE+(#CHAR-IN-BLOCK) ; JSR EPL3L4 ;IF L3>L4 THEN L3EQUL4EQU0 COPYW BEGDIS,BEGFRE ;POINT SCREEN TO CURSOR RTS EJECT ; **** BLOCK PRINT **** ; ; EPCBP JSR PPRINT ;ENTRY POINT FOR "BLOCK PRINT" ROUTINE JSR CONBL ;CONVERT BLOCK TO START + # LINES JMP EPCPL1 ;JUMP INTO PRINT-LINE CODE ; ; ; ; **** BLOCK WRITE **** ; ; EPCBW JSR GETSID JSR CONBL LDA #$80 STA TEMP11 JMP EPCPL1 ; ; ; CONBL JSR EPDB ; LDA BNLINE SEC SBC #2 STA COMC1 LDA BNLINE+1 SBC #0 STA COMC2 ;SET COMMAND REPEAT COUNTER TO # LINES IN BLOCK ; ADDWB BFIRST,#BMLEN; HAVE BFIRST POINT TO BEGINNING OF BLOCK LDA COMC1 ORA COMC2 BEQ CONBL1 COPYW TEMP1,BFIRST; RTS ; CONBL1 PLA PLA RTS ;NOTHING TO DO - FINISHED COMMAND EJECT GETSID LDX TEMP4 ;GET READY TO OPEN SIDEFILE JSR FNPARS ;PARSE FILENAME FROM COMMAND WINDOW BCS GETSD0 LDA INBUF,X ;INSURE FILENAME ONLY (NO PARAMETERS) CMP SDELIM BEQ GETSD1 ;ENDING CHARACTER SHOULD BE STRING DELIMITER ; GETSD0 LDY #IFERRM ;ILLEGAL FILENAME ERROR JMP DISERR ; GETSD1 LDY #FNLEN+3 ;MOVE FILE SPEC PARTS GETSD2 LDA CTSBUF,Y STA NAMSID-1,Y DEY BNE GETSD2 ; LDA CTSBUF STA BDRIVE LDX #EXTSID-FSPART LDY #NAMSID-FSPART JSR MAKEFS ;CREATE THE FILE SPEC ; LDX SCRFIL LDA #LOW [CTSBUF+1] STA ICBAL,X LDA #HIGH [CTSBUF+1] STA ICBAH,X ; RTS EJECT ; **** BLOCK READ **** ; ; EPCBR JSR CURBL ;ENTRY POINT FOR "BLOCK READ" COMMAND JSR GETSID ;MOVER CURSOR TO BEGINNING OF LINE - GETFILESPEC JSR CALCH ;CALCULATE 1/2 OF AVAILABLE RAM (ROUNDING DOWN) ; LDX SCRFIL ;OPEN FILE TO READ LDA #OPEN STA ICCOM,X LDA #4 STA ICAX1,X JSR DISKIO BPL CBR1 ;BRANCH IF NO OPEN ERRORS ; CPY #170 BNE CBR0 ;BRANCH IF NOT "FILE NOT FOUND" ERROR LDY #FFERRM CBR0 JMP DISERR ;SAY "FILE NOT FOUND" NOT "170" & ABORT COMMAND LINE ; CBR1 JSR INSSL ;INSERT TEXT ABOVE CURRENT LINE CBR2 LDX SCRFIL JSR GETLIN ;GET LINE FROM FILE LDY RTEMP3 ;GET STATUS IN Y-REG BMI CBR3 ;BRANCH IF REACHED EOF OR ERROR CONDITION ; LDA BEGFRE+1 ;ONLY READ 1/2 OF AVAILABLE FREE RAM WORTH OF TEXT CMP RTEMP2 BCC CBR2 ;BRANCH IF STILL MORE ROOM IN BUFFER ; JSR WRITUC ;WRITE OUT TEXT BEFORE CURSOR JMP CBR2 ;READ MORE LINES ; CBR3 JSR DELSL5 ;DELETE EXTRA CR (DON'T STICK IN RL-BUFFER) JMP CLOSCR ;CLOSE THE IOCB & EXIT EJECT ; **** MARKER SET ROUTINE **** ; ; EPCMS LDA #HIGH MARKER ;ENTRY POINT FOR "COMMAND BLOCK MARKER INSERT - MS" ROUTINE PHA LDA #LOW MARKER PHA ; ; JSR CURBL ;ENTRY POINT TO "MARKER SET" ROUTINE LDY #0 STY COMC2 INY STY COMC1 JSR INSSL ;DO AN INSERT LINE COMMAND PLA STA TEMP9 PLA STA TEMP10 LDA #CR STA SDELIM ;MARKER ENDS WITH A CR LDA #0 JSR EPCIT1 ;DO INSERT TEXT COMMAND ; INC COMC1 ;SET COMMAND REPEAT COUNTER TO 1 JMP EPCCD ;CURSOR DOWN TO LINE AFTER & EXIT EJECT ; **** COMMAND PRINT LINE(S) **** ; ; EPCWL JSR GETSID ;ENTRY POINT FOR "WRITE N LINES" ROUTINE LDA #$80 ;GET SIDE FILE READY TO OPEN STA TEMP11 ;SET FLAG FOR DISK WRITE, NOT PRINTER WRITE JMP CPL0 ; ; ; EPCPL JSR PPRINT ;ENTRY POINT FOR "PRINT N LINES" ROUTINE CPL0 JSR CURBL ;POINT TO PRINTER FILE SPEC, SET FLAG, &MOVE CURSOR TO BEGINNING OF LINE LDA L3+1 ;MOVE CURSOR TO BEGINNING OF LOGICAL LINE BNE CPL11 JMP CPL6 ;DONE IF NO TEXT AFTER CURSOR CPL11 COPYW TEMP1,L3; POINT TEMP1 TO LINE TO CONVERT ; EPCPL1 LDX SCRFIL ;ENTRY POINT FROM "BLOCK PRINT" ROUTINE LDA #OPEN STA ICCOM,X LDA #8 STA ICAX1,X ;PRINTER IS A OUTPUT DEVICE LDA #'N' STA ICAX2,X ;SELECT NORMAL PRINT MODE JSR CIO BMI CPL4 ;BRANCH IF PRINTER ERROR ; LDA #LOW CTSBUF STA ICBAL,X LDA #HIGH CTSBUF STA ICBAH,X LDA #PUTREC STA ICCOM,X BNE CPL3 ;JUMP ; CPL2 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCC CPL5 ;BRANCH IF DONE CPL12 IFEQ TEMP1,L4,CPL6; BRANCH TO CPL6 IF RUN OUT OF TEXT JSR ADV ;POINT IF DONE CPL3 JSR EPCTS ;CONVERT TABS TO SPACES ; LDY #0 ;DO NOT WRITE OUT BLOCK MARKERS CPL9 LDA CTSBUF,Y CMP MARKER,Y BNE CPL10 ;BRANCH IF NOT A MARKER INY CPY #BMLEN BNE CPL9 ;BRANCH BACK TO CONTINUE MATCH BEQ CPL12 ;BRANCH TO IGNORE MARKER ; CPL10 LDX SCRFIL LDA #200 ;EACH CIO CALL MUST SET BUFFER LENGTH STA ICBLL,X LDA #0 STA ICBLH,X JSR CIO ;WRITE LINE TO PRINTER BPL CPL2 ;BRANCH BACK IF PRINTING SUCCESFULL ; CPL4 STY TEMP3 ;PRINTER (OPERATOR) IN TROUBLE JSR CLOSCR ;CLOSE IOCB LDY TEMP3 ;DISPLAY ERROR AND ABORT CPY #128 BNE CPL8 ;BRANCH IF NOT BREAK KEY ABORT LDY #BAERRM ;POINT TO "BREAK KEY ABORT" ERROR TEXT CPL8 JMP DISERR ; CPL5 JMP CLOSCR ;CLOSE IOCB CPL6 BIT EOFLAG ;RAN OUT OF TEXT TO PRINT BPL CPL7 ;BRANCH IF CAN BRING IN MORE ; JSR CLOSCR ;CLOSE IOCB LDY #CEERRM ;RAN OUT OF TEXT - CURSOR AT END ERROR JMP DISERR ; CPL7 JSR CEBS ;MOVE CURSOR TO END OF BUFFER ******************************************************************************** LDA COMC1 PHA LDA COMC2 PHA JSR WRITUC ;WRITE OUT CURRENT BUFFER JSR EPCIH ;READ IN NEW BUFFER PLA STA COMC2 PLA STA COMC1 ********************************************************************************* LDA L3+1 BEQ CPL6 ;GOT EOF- JUST OUR LUCK COPYW TEMP1,L3; POINT CTS TO 1ST CHARACTER IN BUFFER JMP CPL3 ;CONTINUE PRINTING ; PPRINT LDA #$00 ;SET CTS FLAG TO SPACE FILL TABS STA TEMP11 LDX SCRFIL ;POINT FILE SPEC TO P: LDA #LOW PCOLON STA ICBAL,X LDA #HIGH PCOLON STA ICBAH,X RTS EJECT ; **** MARKER CLEAR ROUTINE **** ; ; EPCMC JSR CURBL ;ENTRY POINT FOR "MARKER CLEAR" ROUTINE JSR CBBS ;START SEARCH AT BEGINNING OF BUFFER ; LDA #CR STA SDELIM ;MARKER DELIMITER IS CARRAIGE RETURN ; COPYWI TEMP9,MARKER; POINT TO MARKER TEXT ; COPYWI BS3,MARKER; POINT TO MARKER TEXT ; CMC1 JSR EPSB1 ;SEARCH THE BUFFER FOR THE MARKER TEXT BCC CMC2 ;SEARCH FAILED - ALL DONE ; JSR EPSET ;SET UP DISPLAY JSR CURBL ;MOVE CURSOR TO BEGINNING OF LINE (DELETE LINE SETUP) JSR DELSL5 ;DELETE THE ENTIRE LINE THE MARKER WAS FOUND IN JMP CMC1 ;REPEAT UNTIL ALL MARKERS GONE ; CMC2 JMP CBBS ;MOVE CURSOR TO BEGINNING OF BUFFER EJECT ; **** READ HALF OF AVAILABLE BUFFER FROM DISK **** ; ; IF 0 ;DO NOT ASSEMBLE OLD IH ROUTINES NOTRAM LDY #MFERRM JMP DISERR ; READHF BIT EOFLAG ;TEST IF INPUT FILE EXAUSTED BPL RDF1 ;BRANCH IF THERE IS MORE TEXT IN INPUT FILE LDY #IEERRM JMP DISOER ;DISPLAY "INPUT AT END" WARNING & EXIT RDF1 JSR CEBS ;CURSOR RIGHT UNTIL NOTHING AFTER CURSOR ; LDA ENDFRE+1 CALC ONE-HALF OF AVAILABLE FREE AREA CLC SBC BEGFRE+1 BCC NOTRAM ;BRANCH -- NOT ENOUGH RAM LSR A ;DIVIDE BY 2 BEQ NOTRAM ;BRANCH -- NOT ENOUGH RAM CLC ADC BEGFRE+1 STA TEMP2 ;SAVE LIMIT ; LDA BEGFRE ;L3 EQU BEGFRE STA L3 LDA BEGFRE+1 STA L3+1 ; READR LDX INFILE ;GET RECORD ENDED BY CR LDA #GETREC STA ICCOM,X LDA BEGFRE ;STORE RECORD AT BEGFRE STA ICBAL,X LDA BEGFRE+1 STA ICBAH,X LDA COLLMT ;LIMIT READ STA ICBLL,X LDA #0 STA ICBLH,X JSR DISKIO BPL READOK CPY #136 BEQ YESEOF ;BRANCH IF EOF DISCOVERED JSR DISOER ;DISPLAY & WAIT FOR ACKNOLEDGE TXA PHA JSR DELAY ;MAKE SURE USER HAS CHANCE TO SEE MESSAGE PLA TAX JMP READOK ;OH MY ; YESEOF STY EOFLAG LDY ICBLL,X WAS PARTIAL LINE TRANSMITTED WITH EOF BEQ RDF2 ;BRANCH IF JUST EOF ; LDA #0 STA ICBLL,X IGNORE PARTIAL LINE ; LDY #NCERRM JSR DISOER ;DISPLAY LINE "NOT COMPLETE" ERROR TXA PHA JSR DELAY PLA TAX ; RDF2 LDY #IEERRM JSR DISOER ;TELL USER EOF OCCURED ; READOK CLC ;BEGFRE EQU BEGFRE + AMOUNT READ LDA BEGFRE ADC ICBLL,X STA BEGFRE LDA BEGFRE+1 ADC ICBLH,X STA BEGFRE+1 ; BIT EOFLAG ;TEST FOR EOF BMI READHE ;BRANCH IF EOF CMP TEMP2 BCC READR ;READ MORE IF RAM LEFT ; READHE LDA BEGFRE ;TEST SPECIAL CASE OF NO DATA IN FILE CMP L3 BNE READS ;BRANCH IF READ SOME DATA LDA BEGFRE+1 CMP L3+1 BNE READS ; NOTRD LDY #0 ;SETUP EMPTY EDITOR WITH 1 CR LDA #CR STA (ENDFRE),Y ; LDA ENDFRE ;ENDFRE EQU ENDFRE - 1 BNE NOTRD1 DEC ENDFRE+1 NOTRD1 DEC ENDFRE ; LDA UMEMHI STA L3 STA L4 STA BEGDIS ; LDA UMEMHI+1 STA L3+1 STA L4+1 STA BEGDIS+1 ; RTS ; ; READS LDA BEGFRE+1 L4 EQU BEGFRE - 1 STA L4+1 LDA BEGFRE STA L4 BNE READH2 DEC L4+1 READH2 DEC L4 ; LDA ENDFRE ;TEMP1 EQU ENDFRE STA TEMP1 LDA ENDFRE+1 STA TEMP2 ; LDY #0 ;MOVE TEXT READ TO HI MEMORY READHM LDA (L4),Y ;MOVE @L4 TO @T1 STA (TEMP1),Y ; LDA L4 ;L4 EQU L4 - 1 BNE READH3 DEC L4+1 READH3 DEC L4 ; LDA TEMP1 ;TEMP1 EQU TEMP1 - 1 BNE READH4 DEC TEMP2 READH4 DEC TEMP1 ; LDA L3+1 ;MORE TO MOVE IF L4 >EQU L3 CMP L4+1 BCC READHM ;BRANCH TO MOVE MORE BNE READH5 LDA L4 CMP L3 BCS READHM ;BRANCH TO MOVE MORE ; READH5 LDA ENDFRE ;L4 EQU ENDFRE STA L4 LDA ENDFRE+1 STA L4+1 ; LDA L3 ;BEGFRE EQU L3 STA BEGFRE LDA L3+1 STA BEGFRE+1 ; LDA TEMP1 ;ENDFRE EQU TEMP1 STA ENDFRE LDA TEMP2 STA ENDFRE+1 ; STA L3+1 ;L3 EQU TEMP1 + 1 LDA TEMP1 STA L3 INC L3 BNE READH6 INC L3+1 ; READH6 LDA L3 ;BEGINNING OF DISPLAY STARTS WITH TEXT JUST READ IN STA BEGDIS LDA L3+1 STA BEGDIS+1 ; JMP EPHPT ;HOME MISC. POINTERS & EXIT ENDIF ; ; ; ;LIST ; EPCIH BIT BADIOF ;ENTRY POINT FOR "INPUT HALF OF AVAILABLE RAM" ROUTINE BVC CIH1 ;BRANCH IF NO PREVIOUS INPUT I/O ERRORS ; LDY #BIERRM JMP DISOER ;DISPLAY "PREVIOUS I/O ERROR" MESSAGE & CONTINUE ; CIH1 BIT EOFLAG BPL CIH2 ;BRANCH IF HAVE NOT REACHED INPUT EOF YET ; LDY #IEERRM JMP DISOER ;DISPLAY "INPUT EOF" MESSAGE & CONTINUE ; CIH2 JSR CEBS ;MOVE CURSOR TO END OF BUFFER ; JSR CALCH ;CALC 1/2 OF AVAILABLE RAM ; CIH3 LDX INFILE ;POINT TO INPUT FILE JSR GETLIN ;READ & INSERT LINE FROM FILE LDA BADIOF LDY RTEMP3 ;RECOVER READ STATUS BPL CIH5 ;BRANCH IF NORMAL STATUS CPY #136 BEQ CIH4 ;BRANCH IF FOUND EOF ORA #$40 ;SET INPUT I/O ERROR BIT LDY #136 ;SET EOF TOO STA BADIOF ;UPDATE BAD-IO-FLAG ; CIH4 STY EOFLAG ;SAVE NEW EOF FLAG CIH5 TYA ;SET FLAGS BMI CIH6 ;BRANCH IF DONE ; LDA BEGFRE+1 CMP RTEMP2 BCC CIH3 ;BRANCH IF ROOM TO READ MORE ; CIH6 LDA COMC1 ORA COMC2 BEQ CIH7 ;NULL READ - EXIT ; JSR EPCCU ;CURSOR UP TO FIRST LINE READ ; CIH7 RTS EJECT ;NOLIST ; **** WRITE OUTPUT UPTO CURSOR **** ; ; WRITUC BIT BADIOF ;IF PREVIOUS I/O ERROR ON IH,OC THEN LOCK OUT THIS COMMAND BPL WRITU0 ;BRANCH IF NO PREVIOUS ERRORS ; WRITU4 LDY #BIERRM ;POINT TO "BAD I/O ERROR" MESSAGE JMP DISERR ;DISPLAY ERROR & EXIT ; WRITU0 JSR CURBL ;MOVE CURSOR TO BEGINNING OF LINE LDA L1+1 ;IF (L1EQUL2EQU0) THEN NOP BNE WRITU5 ;BRANCH IF NOTHING TO WRITE ******************************************************************************** ; ; JSR EPCMC ;REMOVE ALL BLOCK MARKERS FROM BUFFER ****** LOOKY HERE JMP WRITU3 WRITU5 LDY #0 STY $4FCD WRITUD STY $500E STY $500F LDA L1 STA $D0 LDA L1+1 STA $D1 DBG02 LDA ($D0),Y CMP #CR BNE WRITUF INC $500E BNE WRITUG INC $500F WRITUG NOP WRITUF LDA $D0 CMP L2 BNE WRITUB LDA $D1 CMP L2+1 BEQ WRITU7 NOP NOP WRITUB INC $D0 BNE WRITU9 INC $D1 NOP WRITU9 JMP DBG02 WRITU7 JSR CBBS LDX $5012 LDY #0 WRITU8 LDA (L3),Y CMP MARKER,Y BNE WRITUA INY CPY #$1A BNE WRITU8 BEQ WRITU2 WRITUA LDA L3 STA ICBAL,X LDA L3+1 STA ICBAH,X LDA #$C8 STA ICBLL,X LDA #$00 STA ICBLH,X LDA #$09 STA ICCOM,X JSR DISKIO BPL WRITU2 ;BRANCH IF NO ERRORS LDA BADIOF ORA #$80 STA BADIOF JMP DISERR ;DISPLAY CAUSE OF PROBLEM ; WRITU2 JSR DELSL5 LDA $500E BNE WRITU6 DEC $500F WRITU6 NOP DEC $500E LDA $500E ORA $500F BNE WRITU7 ************************************************************************** ; WRITU3 RTS EJECT ; **** NORMAL & ABNORMAL EXIT ROUTINES **** ; ; ABORTX LDA #2 JSR EPNCK ;CHECK N RANGE (0-1) ; LDA DDRIVE ;ABORT EDIT - CLOSE & DELETE TMP FILE STA TEMP1 LDX #EXTTMP-FSPART STX TEMP2 ; LDX OUTFIL ;CLOSE OUTPUT FILE (.TMP) JSR CLODIO BPL ABORT1 JSR DISOER ;DISPLAY MYSTERIOUS ERROR NUMBER ; ABORT1 JSR FCLOS1 ;DELETE OUTPUT FILE (.TMP) JMP NORMX3 ;DO EXIT HOUSEKEEPING ; NORMX LDA #2 JSR EPNCK ;CHECK N RANGE (0-1) ; BIT BADIOF ;ENTRY POINT FOR "EXIT" ROUTINES BPL NORMX7 ;BRANCH IF NO PREVIOUS OUTPUT ERRORS TO .TMP ; JMP WRITU4 ;DISPLAY "PREVIOUS I/O ERROR" MESSAGE ; NORMX7 PUSHCC ;PUSH COMMAND REPEAT COUNTER ONTO STACK JSR EPCEF ;GET TO THE END-OF-FILE JSR WRITUC ;WRITE OUT THE FINAL BUFFER PULLCC ;RECOVER COMMAND REPEAT COUNTER FROM STACK ; LDA SDRIVE ;DELETE THE OLD BACKUP FILE STA TEMP1 LDX #EXTBAK-FSPART STX TEMP2 JSR FCLOSE ;ALSO CLOSE THE INPUT & OUTPUT FILES ; LDA DDRIVE ;IF SOURCE AND DEST DRIVE NOT THE SAME THEN CMP SDRIVE ;...DELETE THE FILE ON THE DEST. DRIVE THAT BEQ NORMX2 ;...HAS THE SAME NAME AS THE FILE WERE ; ; ;...EDITTING IF IT EXISTS LDX #EXTFIL-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDX SCRFIL LDA #DELETE JSR SETDIO ;HAVE CIO DELETE THE FILE IF IT EXISTS JSR CHKERR ;DISPLAY MYSTERIOUS ERROR (EXCEPT 170 ;S) IF ANY ; NORMX2 LDA SDRIVE ;RENAME FILE AS .BAK LDX #EXTFIL-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE 1ST HALF OF RENAME FILE SPEC LDA #$80 ;SET RENAME FLAG LDX #EXTBAK-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE 2ND HALF OF RENAME FILE SPEC LDX SCRFIL ;USE SCRATCH IOCB TO RENAME FILE LDA #RENAME JSR SETDIO ;SET UP CIO JSR CHKERR ;DISPLAY ANY ERROR (EXCEPT 170 ;S) IF ANY ; LDA DDRIVE ;RENAME THE .TMP FILE AS THE FILE LDX #EXTTMP-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDA #$80 ;APPEND ANOTHER FILE SPEC FOR RENAME COMMAND LDX #EXTFIL-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE THE RENAME FILE SPEC LDX SCRFIL LDA #RENAME JSR SETDIO ;HAVE CIO RENAME THE FILE BPL NORMX3 JSR DISOER ;DISPLAY MYSTERIOUS ERROR NUMBER ; NORMX3 LDX KEYBD ;CLOSE KEYBOARD BEFORE LEAVING JSR CLODIO ; BIT REOPFG ;TEST IF EXITTING OR RE-OPENING A FILE BPL NORMX6 ;BRANCH TO EXIT NORMX4 JMP RERUN ;RE-RUN THE EDITOR WITH THE SAME FILE NORMX6 LDA #0 TAX JSR MCURS ;KILL MIKE A. CURSOR ; LDX #0 LDY #0 LDA #2 JSR SETVBV ;KILL KEYBOARD TIME-OUT JSR-VECTOR ; LDX #SYSED ;CLOSE & REOPEN E: SO RESTORE MEMTOP AND NORMAL DISPLAY LIST JSR CLODIO ;CLOSE E: ; LDA #LOW ECOLON ;POINT TO E: FILE SPEC STA ICBAL,X LDA #HIGH ECOLON STA ICBAH,X LDA #$0C ;OPEN FOR INPUT/OUTPUT STA ICAX1,X LDA #OPEN STA ICCOM,X JSR CIO LDY #1 JSR DELAY1 ;WAIT 1 VBLANK SO E: CAN SET ITSELF UP ; ; LDA COMC1 ;DECIDE IF RETURNING TO DOS OR EDITOR CMP #2 BEQ NORMX4 ; NORMX5 LDA #0 STA COLDST ;LET SYSTEM-RESET RESET NOT BOOT JSR EPREF ;RESET EDITOR FLAGS (ESCAPE & START/STOP) IF DOS3-1 ;ASSEMBLY IF DOS-2 JMP (DOSVEC) ;RETURN TO DOS II (BUG DENIES RTS) ENDIF IF DOS3 ;ASSEMBLY IF DOS-3 RTS ;RETURN TO DOS-3 ENDIF ; ; GODOS LDA #0 ;RETURN TO DOS STA REOPFG STA COMC1 STA COMC2 BEQ NORMX3 ;CLEAN UP & RETURN TO DOS ; ; ; FCLOSE LDX OUTFIL ;CLOSE THE OUTPUT FILE JSR CLODIO BPL FCLOS1 JSR DISOER ;DISPLAY MYSTERIOUS I/O ERROR (IGNORE OTHERWISE) ; FCLOS1 LDX INFILE ;CLOSE THE INPUT FILE JSR CLODIO BPL FLCOS2 JSR DISOER ;DISPLAY MYSTERIOUS ERROR NUMBER ; FLCOS2 LDA TEMP1 ;RECOVER DRIVE NUMBER LDX TEMP2 ;RECOVER EXTENSION LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE THE PROPER FILE SPEC LDA #DELETE LDX SCRFIL JSR SETDIO ;SET UP CIO TO DELETE JMP CHKERR ;CHECK FOR ERRORS (EXCEPT 170 ;S) IF ANY - THEN RTS EJECT ; **** INSERT CHARACTER ROUTINES **** ; ; INSSC LDX L4+1 BNE INSSC3 ;BRANCH IF THERE IS TEXT AFTER THE CURSOR ; PHA JSR INSSL ;CREATE A NEW LINE FIRST PLA CMP #CR ;CHECK TO SEE IF INSERTING A CR AT END OF BUFFER BEQ INSSC2 ;BRANCH IF INSERTING A CR - ALREADY DONE - EXIT ; INSSC3 BIT ATREAL ;IS CURSOR AT REAL OR IMAGINARY PLACE BMI INSSC6 ;BRANCH IF AT REAL PLACE PHA ;SAVE CHARACTER TO INSERT LDY #0 ;FIND OUT IF IN IMAGINARY TAB OR CR LDA (L3),Y CMP #CR BNE INSSC4 ;BRANCH IF IMAGINARY TAB ; ************************************************************************** LDX SAVLOG CPX $4FD6 BCS INSSC7 PUSHCC ;SAVE COMMAND REPEAT COUNTER ON STACK STY COMC2 INX STX COMC1 ****************************************************************************** JSR EPCCC ;DO A "CURSOR TO COLUMN N" PULLCC ;RECOVER COMMAND REPEAT COUNTER FROM STACK PLA ;RECOVER CHARACTER TO INSERT JMP INSSC ;INSERT THE DESIRED CHARACTER - RECURSIVE CALL ; INSSC4 LDA SAVLOG ;ITS A TAB PHA JSR EPCLS ;CURSOR TO LEFT OF TAB ; INSSC5 LDA #' ' ;INSERT A BLANK JSR INSSC ;- RECURSIVE CALL PLA PHA CMP SAVLOG ;SEE IF AT DESIRED COLUMN YET BNE INSSC5 PLA PLA JMP INSSC ;INSERT DESIRED CHARACTER - RECURSIVE CALL ; INSSC6 JSR INSRM ;PUT CHAR @ L3-1 IF FREE MEMORY - EXIT IF ERROR CMP #CR ;IF INSERTING A CR WE CAN SKIP A LINE LIMIT CHECK BEQ INSSC1 ;BRANCH IF CR TO SKIP LINE LIMIT CHECK LDX SAVLOG ;WHAT COLUMN IS CURSOR AT ? ; JSR FINNCL ;CALC NEW LINE LENGTH ; CPX COLLMT ;COMPARE NEW LINE LENGTH WITH LINE LIMIT BCC INSSC1 ;BRANCH IF OK ; JSR DELRM ;GET RID OF THIS TROUBLE MAKER INSSC7 LDY #LLERRM JMP DISERR ;LINE TO LONG ERROR ; INSSC1 JSR EPCRS ;CURSOR RIGHT TO SET UP FOR NEXT INSERT BIT ATREAL ;TEST IF AT IMAGINARY CURSOR BPL INSSC1 ;BRANCH IF INSIDE IMAG. CR -- CURSOR RIGHT AGAIN INSSC2 RTS ; ; ; COMIT ;ENTRY POINT FOR "INSERT TEXT" COMMAND LDA L4+1 BNE CIT3 JSR INSSL CIT3 LDA #LOW INBUF STA TEMP9 LDA #HIGH INBUF STA TEMP10 CIT4 LDA TEMP4 ;RECOVER POINTER TO STRING EPCIT1 PHA TAY LDA (TEMP9),Y ;FETCH CHARACTER FROM STRING CMP SDELIM BEQ COMIT2 ;FOUND END OF STRING - EXIT JSR INSSC ;INSERT CHAR. AT CURSOR PLA CLC ADC #1 BNE EPCIT1 ;JUMP COMIT2 PLA JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CIT4 ;REPEAT COMMAND RTS EJECT ; **** SEARCH ENTRY POINTS **** ; ; EPCSB LDA #$00 ;ENTRY POINT FOR "SEARCH BUFFER" ROUTINE JMP EPSRV EPCSF LDA #$01 ;ENTRY POINT FOR "SEARCH FILE" ROUTINE JMP EPSRV EPCSRB LDA #$80 ;ENTRY POINT FOR "SEARCH/REPLACE BUFFER" ROUTINE JMP EPSRV EPCSRF LDA #$81 ;ENTRY POINT FOR "SEARCH/REPLACE FILE" ROUTINE JMP EPSRV EPCSVB LDA #$40 ;ENTRY POINT FOR "SEARCH/REPLACE W/VERIFY BUFFER" ROUTINE JMP EPSRV EPCSVF LDA #$41 ;ENTRY POINT FOR "SEARCH/REPLACE W/VERIFY FILE" ROUTINE JMP EPSRV EJECT ; **** RECOVER DELETED LINE ROUTINE **** ; ; EPCRL ;ENTRY POINT FOR "RECOVER DELETED LINE" ROUTINE JSR INSSL LDA #LOW RLBUFR ;DO AN INSERT LINE COMMAND LDX #HIGH RLBUFR EPCRL1 STA TEMP9 ;POINT TO THE RECOVER LINE BUFFER STX TEMP10 LDA #CR STA SDELIM ;LINE ENDS WITH A CR LDA #0 BEQ EPCIT1 ;JUMP INTO INSERT-TEXT ROUTINE ; EJECT ; **** MARGIN SET ROUTINES **** ; ; ********************************************************************** EPLMSZ STA TEMP1 ASL A ADC TEMP1 CMP $4CBB BCC EPLM1 BIT $4D36 BMI EPLM2 CMP $4D36 BCC EPLM1 EPLM2 RTS EPLM1 LDY #$13 EPLM3 JMP DISERR EPLMS LDA COMC2 BNE EPLM1 LDA COMC1 CMP $4FF9 BCS EPLM1 TAY LDA #$2A SBC $5001 SEC SBC COMC1 JSR EPLMSZ STY $4FF8 DEY STY $5000 JMP SETMAR EPRMS LDA COMC2 BNE EPLM1 LDA COMC1 BNE DBG03 LDA #$28 STA COMC1 DBG03 TAY CMP #$29 BCS EPLM1 LDA $4FF8 CMP COMC1 BCS EPLM1 TYA SEC SBC $5000 JSR EPLMSZ STY $4FF9 LDA #$28 SEC SBC COMC1 STA $5001 **************************************************************************** ; SETMAR JSR EPHL ;HOME LINE CURSOR IS ON ; LDA LMARG CLC ADC RMARG STA SIZMAR ;SIZE-MARGIN EQU LEFT-MARGIN + RIGHT-MARGIN ; LDA #41 SBC SIZMAR STA LINSIZ ;LINE-SIZE EQU 40 - SIZE-OF-MARGIN ; SBC #1 STA LINSZ3 ;LINE-SIZE-3 EQU LINE-SIZE - 1 ; LDA LINSZ3 ;COMMAND-LINE-LIMIT EQU LINE-SIZE * 3 - 2 ASL A ADC LINSIZ STA COMLMT ; LDA SAVMSC ;CLEAR SCREEN & EXIT STA TEMP1 LDA SAVMSC+1 STA TEMP2 ; LDA #LOW [40*24] ;CLEAR 24-LINES BY 40-COLUMNS STA TEMP3 LDA #[HIGH [40*24]+1] STA TEMP4 LDY #0 ; LMS2 LDA #0 ;STORE "BLANK" IN DISPLAY AREA STA (TEMP1),Y ; INC TEMP1 ;POINT TO NEXT POSITON BNE LMS3 INC TEMP2 ; LMS3 LDA TEMP3 ;DECREMENT REPEAT COUNTER BNE LMS4 DEC TEMP4 LMS4 DEC TEMP3 ; ORA TEMP4 BNE LMS2 ;BRANCH BACK UNTIL SCREEN CLEARED ; JSR EPDCW ;RE-DISPLAY COMMAND WINDOW WITH NEW MARGINS JMP CEW ;CLEAR ERROR WINDOW & EXIT ; EJECT ; **** RE-OPEN EDITOR WITH SAME FILE **** ; ; EPCRE LDA REOPFG ;ENTRY POINT FOR "RE-OPEN EDITOR WITH SAME FILE" ROUTINE ORA #$80 ;SET FLAG SO EDITOR RERUNS WITH SAME FILE STA REOPFG JMP NORMX ;EXIT WITH THIS FILE & RE-RUN THE EDITOR EJECT ; **** CONVERT TABS TO SPACES COMMAND **** ; ; EPCCTS JSR CURBL ;ENTRY POINT FOR "CONVERT TABS TO SPACES COMMAND ; CCTS1 LDA L3+1 BEQ CCTS2 ;BRANCH IF PREMATURELY RAN OUT OF TEXT ; COPYW TEMP1,L3; ;POINT TO LINE TO CONVERT JSR EPCTS ;CONVERT TAB TO SPACES JSR INSSL ;INSERT A LINE ABOVE CURRENT LINE ; PUSHCC ;SAVE COMMAND REPEAT COUNTER ON STACK LDX #1 STX COMC1 DEX STX COMC2 LDA #LOW CTSBUF LDX #HIGH CTSBUF JSR EPCRL1 ;MOVE CONVERTED LINE FROM BUFFER INTO TEXT LDX #1 STX COMC1 DEX STX COMC2 JSR EPCCD ;CURSOR DOWN TO ORIGINAL LINE JSR DELSL ;DELETE ORIGINAL LINE PULLCC ;RECOVER COMMAND REPEAT COUNTER FROM STACK JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCS CCTS1 ;BRANCH TO REPEAT RTS ;ALL DONE-EXIT ; CCTS2 LDY #CEERRM JMP DISERR ;DISPLAY "CURSOR AT END" ERROR AND ABORT EJECT ; **** SCREEN DISPLAY ROUTINE **** ; ; DISPLY LDY #0 ;DURING IMAG. DISPLAY - DISPLAY RIGHT CHARS. LDA (L3),Y STA ($A9),Y ;MOVE CHAR. @ L3 TO @ L2+1 *************** ; LDA L3+1 ;COPY L3 TO TEMP 3 & 4 STA TEMP4 LDA L3 STA TEMP3 BIT ATREAL BMI DISPL1 ;IF AT REAL LOCATION EVERYTHING IS PEACHY INC TEMP3 ;BUMP L3 TEMPORARILY FOR SCREEN DISPLAY BNE DISPL1 INC TEMP4 ; DISPL1 LDA SAVMSC ;INIT POINTER TO FIRST CHAR. OF OUTPUT AREA CLC ADC LMARG ;DO NOT FORGET LEFT MARGIN OFFSET STA SPOINO LDA SAVMSC+1 ADC #0 STA SPOINO+1 ; LDA BEGDIS ;INIT POINTERS TO FIRST CHARACTER TO DISPLAY STA SPOINI LDA BEGDIS+1 STA SPOINI+1 LDA BEGCOL ;SET UP BEGINNING COLUMN STA LOGCOL LDA BEGTFG ;SET UP BEGINNING TAB-FLAG STA TFLAG LDY #1 ;SET ROW & COLUMN TO 1 FOR START STY CRFLAG STY COLCNT NEWLIN STY LINCNT CONLIN LDA COLCNT CMP COLCUR ;TEST IF SHOULD DISPLAY CURSOR NOW BNE NOCUR ;BRANCH IF NO CURSOR LDA LINCNT CMP ROWCUR BNE NOCUR ;BRANCH IF NO CURSOR ; LDA LOGCOL ;SAVE LOGICAL COLUMN OF CURSOR CMP SAVLOG ;DEBUG AID SAYS SAVLOG SHOULD EQU LOGCOL NOW BEQ DEBUG1 LDY #ECERRM ;EDITOR CONFUSED WARNS UN-SYNC-ED POINTERS JSR DISOER ;DISPLAY & THEN WAIT AFTER ERROR DEBUG1 LDA TEMP3 ;CHARACTERS NOW COME FROM AFTER CURSOR AREA STA SPOINI LDA TEMP4 BNE MORTXT LDA #$FF MORTXT STA SPOINI+1 LDX ROWCUR CLC LDA LMARG ADC COLCUR CPX OLDCUR STX OLDCUR BEQ QUICK JSR MCURS JMP NOCUR ; QUICK JSR CURH NOCUR INC LOGCOL ;INCREMENT LOGICAL COLUMN BIT CRFLAG ;TEST IF IN MIDDLE OF CARRIAGE RETURN BPL TESTAB ;BRANCH IF NOT IN MIDDLE BMI CHRBLK ;DISPLAY SPACE CHARACTER ; RETAB INC TFLAG ;TURN OFF TAB FLAG TESTAB BIT TFLAG ;TEST IF IN MIDDLE OF TAB BPL CHRGET ;BRANCH IF NOT IT MIDDLE LDA LOGCOL TAY ;BITGET ROUTINE FROM OS AND #7 TAX LDA MASKTB,X STA TEMP1 TYA LSR A LSR A LSR A TAX LDA TABMAP,X AND TEMP1 BNE RETAB ; LDA #$0E ;DEFAULT TO "." SHOWN FOR TAB BIT VISTAB ;TEST IF VISIBLE TAB MODE BMI CHROU2 ;BRANCH IF IT IS VISIBLE TAB MODE BPL CHRBLK ;TABS SHOWN AS SPACE IN NON-VISIBLE MODE ; CHRGET LDA SPOINI+1 ;TEST IF AT END OF BUFFER CMP UMEMHI+1 BCC CHRLDA ;BRANCH IF ANOTHER CHAR. AVAILABLE BNE CHRBLK ;BRANCH IF ANOTHER CHAR. NOT AVAILABLE LDA SPOINI CMP UMEMHI BCC CHRLDA ;BRANCH IF HER CHAR. NOT AVAILABLE BEQ CHRLDA ;BRANCH IF ANOTHER CHAR. AVAILABLE ; CHRBLK LDA #$00 ;DISPLAY A SPACE CHARACTER BEQ CHROU2 ; CHRLDA LDY #0 LDA (SPOINI),Y ;FETCH CHARACTER FROM MEMORY INC SPOINI ;DOUBLE BYTE INCREMENT POINTER BNE CHREXT INC SPOINI+1 CHREXT CMP #CR ;TEST IF CHAR. IS A CARRAIGE-RETURN BNE NOCR ;BRANCH IF NO CARRAIGE-RETURN STA CRFLAG ;SET FLAG TO DISPLAY CR BIT VISCR ;TEST IF CR ARE INVISIBLE OR NOT BPL CHRBLK LDA #$5D ;SHOWN CR AS DOWN-ARROW BNE CHROU2 ; NOCR CMP #TAB ;TEST IF CHAR. IS A TAB BNE CHROUT ;BRANCH IF NOT A TAB BIT TABFAK ;TEST IF TABS ARE REAL OR FAKE BMI CHROU2 ;BRANCH IF TABS ARE FAKE BIT VISTAB ;TEST IF VIS. OR NON-VIS. TAB MODE BMI VISIBL ;BRANCH IF ITS A VIS. TAB LDA #$00 ;DISPLAY A BLANK VISIBL DEC TFLAG ;TURN ON TAB FLAG BMI CHROU2 ; CHROUT TAY LDA INTTAB,Y ;LOOKUP INTERNAL CODE FOR ATASCI CHARACTER CHROU2 LDY #0 STA (SPOINO),Y ;STORE INTER. FORM CHAR. IN DMA DISPLAY AREA INC SPOINO ;DOUBLE BYTE INCREMENT POINTER BNE GETEXT INC SPOINO+1 GETEXT LDA COLCNT CMP LINSIZ BEQ ENDLIN INC COLCNT JMP CONLIN ;START AGAIN FOR NEXT CHARACTER ; ENDLIN BIT CRFLAG ;IF CR AND END-OF-LINE THEN RESET LOG. COL. BPL ENDLN1 STY LOGCOL ; ENDLN1 LDX SIZMAR ;DETERMINE HOW MANY SPACES TO SKIP MARSKP DEX BMI DONSKP INC SPOINO BNE MARSKP INC SPOINO+1 BNE MARSKP DONSKP LDA #1 ;CLEAR CRFLAG AND SET COLUMN COUNTER TO 1 STA COLCNT STA CRFLAG INC LINCNT ;TEST IF DONE LDY LINCNT CPY #21 ;20 LINES IN TEXT WINDOW BEQ DONE ;BRANCH IF DONE WITH DISPLAY JMP NEWLIN ;START AGAIN FOR NEXT CHARACTER DONE RTS EJECT ; **** CLEAR & DISPLAY COMMAND WINDOW ROUTINE **** ; ; EPRCW LDY #120 ;ENTRY POINT FOR "CLEAR COMMAD WINDOW" ROUTINE LDA #$20 ;FILL COMMAND WINDOW WITH BLANKS RCW1 STA INBUF-1,Y DEY BNE RCW1 RTS ; ; EPRAW LDY #120 ;ENTRY POINT TO INIT ALTERNATE WINDOW LDA #' ' ; RAW1 STA INBUF2-1,Y DEY BNE RAW1 RTS ; ; ; ; ; EPDCW LDA #3 ;ENTRY POINT FOR "DISPLAY COMMAND WINDOW" ROUTINE STA LINCNT ;THE COMMAND WINDOW IS 3 LINES LONG LDY #0 LDX #0 LDA LMARG ;SKIP OVER LEFT MARGIN TO START BPL DCW2 ;JUMP ; DCW1 LDA SIZMAR ;SKIP OVER MARGIN DCW2 STA COLCNT DCW3 DEC COLCNT BMI DCW4 ;BRANCH IF DONE SKIPPING OVER MARGIN INY ;SKIP A SPACE BNE DCW3 ; DCW4 LDA LINSIZ ;GET HOW MANY CHARACTERS TO OUTPUT / LINE STA COLCNT DCW5 DEX ;CHECK FOR CURSOR CPX COMCOL BNE DCW7 ;BRANCH IF CURSOR DOES NOT GO HERE NOW LDA MODE STA (MPOINT),Y ;OUTPUT CURSOR INY INX INX ;SKIP OVER EMPTY PLACE UNDER CURSOR BNE DCW6 ;JUMP DCW7 INX STY TEMP1 LDY INBUF,X ;GET CHARACTER FROM CURRENT COMMAND WINDOW LDA INTTAB,Y LDY TEMP1 STA (MPOINT),Y INY INX DCW6 DEC COLCNT BNE DCW5 DEC LINCNT BNE DCW1 ;LOOP BACK FOR NEXT LINE OF COMMAND WINDOW RTS EJECT ; **** TOGGLE VISIBLE MODES ROUTINES **** ; ; TOGVTB LDA #$80 ;TOGGLE VIS-TAB-FLAG EOR VISTAB STA VISTAB RTS ; ; ; ; TOGVCR LDA #$80 ;TOGGLE VIS-CR-FLAG EOR VISCR STA VISCR RTS EJECT ; **** DISPLAY PRIOR 20 LINES ROUTINE **** ; ; PRIOR JSR EPBP ;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE ; CLC ;CALC HOW MANY CURSOR UPS TO DO LDA ROWCUR ADC #19 STA TEMP8 ; PRIOR1 LDA L1+1 BNE PRIOR2 ;BRANCH IF TEXT ABOVE LDY #CEERRM JMP DISERRM ; PRIOR2 JSR EPCUS ;MOVE UP PHYSICAL LINE DEC TEMP8 BNE PRIOR1 RTS EJECT ; **** ADVANCE TO NEXT SCREEN FULL **** ; ; NEXT JSR EPBP ;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE ; LDA #20 ;CALC HOW MANY LINES TO CURSOR DOWN SEC SBC ROWCUR ADC #19 STA TEMP8 ; NEXT1 LDA L3+1 ;CHECK TO SEE IF AT END OF BUFFER BNE NEXT2 ;BRANCH IF MORE TEXT LDY #CEERRM JMP DISERR ; NEXT2 JSR EPCDS ;CURSOR DOWN TO BRING NEXT SCREEN DEC TEMP8 BNE NEXT1 ; NEXT3 LDA #19 ;MOVE CURSOR TO BEGINNING OF SCREEN STA TEMP8 NEXT5 LDA L1+1 BEQ NEXT4 ;BRANCH IF OUT OF TEXT AGAIN JSR EPCUS DEC TEMP8 BNE NEXT5 NEXT4 JMP EPBP ;MOVE CURSOR TO BEGINNING OF PHYSICAL LINE EJECT ; **** INSERT LINE COMMAND **** ; ; INSSL JSR CURBL ;FIND BEGINNING OF CURRENT LINE LDA #CR ;INSERT A CR AFTER CURSOR - THATS ALL JMP INSRM ;DO IT -- DON'T BOTHER TO COME BACK IF NO MEMORY ; ; ; ; **** INSERT TAB COMMAND **** ; ; EPITS LDA #TAB ;ENTRY POINT FOR "INSERT TAB" ROUTINE BIT TABFAK BPL ITS4 ;BRANCH IF EXPANDING TABS SELECTED ; JSR EPMCK ;DON'T RETURN UNLESS APPROX 200+ BYTES FREE LEFT LDY $92 STY $5008 ;********************************************* INY STY COMC1 LDA #$00 STA COMC2 JSR EPCCC ******************************************************************************* ; ITS1 LDA L4+1 BNE ITS0 ;BRANCH IF AT END OF BUFFER JSR INSSL ;INSERT A LINE FOR TAB TO BE ON ITS0 LDA #' ' JSR GETLN5 ;SPECIAL INSERT ROUNTINE (NO MEMORY CHECK ; RETURNS LINE LENGTH STATUS) BPL ITS2 ;BRANCH IF LINE TOO LONG NOW LDA SAVLOG CLC ADC #1 JSR BITGET BCC ITS1 ;BRANCH BACK TO CONTINUE TABBING RTS ;SPACE TAB INSERTED OK - DONE ; ITS2 LDA SAVLOG ;LINE NOW TOO LONG - BACK-OUT SPACE TAB CMP RTEMP1 BEQ ITS3 ;NEW TAB REMOVED - DONE JSR DELLS ;DELETE ONE SPACE OF SPACE-TAB JMP ITS2 ;CONTINUE UNTIL ALL OF SPACE-TAB GONE ; ITS3 LDY #LLERRM ;DISPLAY LINE TOO LONG ERROR & ABORT COMMAND JMP DISERR ; ITS4 JMP INSSC ;INSERT THE EXPANDING TAB EJECT ; **** AUTO - INDENT ROUTINE **** ; ; EPAI BIT AUTOIF ;ENTRY POINT FOR "AUTO-INDENT" KEYSTROKE ROUTINE BPL AI4 ;ROUTINE DISABLED - JUST INSERT A CR ; LDA #0 STA COMC2 ****************************************************************************** LDY SAVLOG INY STY COMC1 ****************************************************************************** ; JSR CURBL ;MOVE CURSOR TO BEGINNING OF LINE LDY #0 ; AI1 LDA (L3),Y ;GET CHARACTER START OF PREVIOUS (ALMOST) LINE CMP #' ' ;TEST FOR WHITESPACE CHARACTERS (EXPANDING TABS OR SPACES) BEQ AI2 ;BRANCH IF FOUND WHITESPACE BIT TABFAK BMI AI3 ;BRANCH IF AT END OF WHITESPACE CHARACTERS CMP #TAB BNE AI3 ;BRANCH IF AT END OF WHITESPACE CHARACTERS ; AI2 STA CTSBUF,Y ;SAVE ALL LEADING WHITESPACE CHARACTERS IN CTS BUFFER INY BNE AI1 ;JUMP - LOOK FOR MORE WHITESPACE ; AI3 LDA #'/' ;END OF WHITESPACE - TERMINATE CTS BUFFER STA SDELIM ;SET / ALSO AS "INSERT TEXT" TERMINATOR STA CTSBUF,Y ; JSR EPCCC ;MOVE CURSOR BACK TO THE ORIGINAL COLUMN LDA #CR ;PUT IN THE CR JSR INSSC ; LDA #LOW CTSBUF ;POINT TO CTS BUFFER STA TEMP9 LDA #HIGH CTSBUF STA TEMP10 ; LDA #1 ;SET REPEAT COUNTER TO 1 STA COMC1 LDA #0 STA COMC2 ; JMP EPCIT1 ;A-REG MUST BE ZERO - INSERT THE WHITESPACE ON NEW LINE & EXIT ; AI4 LDA #CR ;JUST INSERT A CR JMP INSSC EJECT ; **** MOVE MEMORY CURSOR LEFT **** ; ; CURLM LDA L3+1 ;IF (L3EQUL4EQU0) THEN... BNE CURLM1 ;.... DON'T BRANCH ; LDA ENDFRE ;ELSE L3 EQU ENDFRE STA L3 ;L4 EQU ENDFRE STA L4 LDA ENDFRE+1 STA L3+1 STA L4+1 BNE CURLM3 ;JUMP ; CURLM1 LDA L3 ;L3 EQU L3 - 1 BNE CURLM2 DEC L3+1 CURLM2 DEC L3 ; CURLM3 LDY #0 LDA (L2),Y ;MOVE CHARACTER @L2 TO LOCATION @L3 STA (L3),Y ; LDA L2 ;L2 EQU L2 - 1 BNE CURLM4 DEC L2+1 CURLM4 DEC L2 ; LDA ENDFRE ;ENDFRE EQU ENDFRE - 1 BNE CURLM5 DEC ENDFRE+1 CURLM5 DEC ENDFRE ; CURLM6 LDA BEGFRE ;BEGFRE EQU BEGFRE - 1 BNE CURLM7 DEC BEGFRE+1 CURLM7 DEC BEGFRE ; EPL1L2 LDA L2+1 ;IF L2 < L1 THEN L1 EQU 0 CMP L1+1 ;L2 EQU 0 BCC CURLM8 BNE CURLMX LDA L2 CMP L1 BCS CURLMX ; CURLM8 LDA #0 ;.... THEN L1 EQU 0 STA L1 ;L2 EQU 0 STA L1+1 STA L2 STA L2+1 ; CURLMX RTS ;ELSE EJECT ; **** MEMORY CURSOR RIGHT ROUNTINE **** ; ; CURRM LDA L1+1 ;IF (L1EQUL2EQU0) THEN.... BNE CURRM1 ;..... DON'T BRANCH ; LDA UMEMLO ;... ELSE L1 EQU UMEMLO STA L1 ;L2 EQU UMEMLO STA L2 ;BEGDIS EQU UMEMLO STA BEGDIS LDA UMEMLO+1 STA L1+1 STA L2+1 STA BEGDIS+1 BNE CURRM2 ;JUMP CURRM1 INC L2 ;L2 EQU L2 + 1 BNE CURRM2 INC L2+1 ; CURRM2 LDY #0 LDA (L3),Y ;MOVE CHARACTER @ L3 TO LOCATION @ L2 STA (L2),Y ; INC L3 ;L3 EQU L3 + 1 BNE CURRM3 INC L3+1 ; CURRM3 INC BEGFRE ;BEGFRE EQU BEGFRE + 1 BNE CURRM4 INC BEGFRE+1 ; CURRM4 INC ENDFRE ;ENDFRE EQU ENDFRE + 1 BNE EPL3L4 INC ENDFRE+1 ; EPL3L4 LDA L4+1 ;IF L3 > L4 THEN L3 EQU 0 CMP L3+1 ;L4 EQU 0 BCC CURRM6 BNE CURRM7 ; LDA L4 CMP L3 BCS CURRM7 ; CURRM6 LDA #0 ;... THEN L3 EQU 0 STA L3 ;L4 EQU 0 STA L3+1 STA L4 STA L4+1 ; CURRM7 RTS EJECT ; **** DELETE MEMORY ROUTINES (LEFT & RIGHT) **** ; ; DELLM LDA L2 ;DELETE LEFT ROUTINE BNE DELLM1 DEC L2+1 DELLM1 DEC L2 ;L2 EQU L2 - 1 ; JMP CURLM6 ;BEGFRE EQU BEGFRE - 1 ;IF L2 < L1 THEN L1 EQU 0 ;L2 EQU 0 ; ; ; ; DELRM INC L3 ;DELETE RIGHT BNE DELRM1 INC L3+1 ;L3 EQU L3 + 1 ; DELRM1 JMP CURRM4 ;ENDFRE EQU ENDFRE + 1 ;IF L3 > L4 THEN L3 EQU 0 ;L4 EQU 0 ; **** MEMORY POINTERS TO END OF BUFFER **** ; ; CEBM LDA L3+1 ;TEST IF NO CHARACTERS AFTER CURSOR BEQ CEBM1 ;BRANCH IF DONE JSR CURRM ;MOVE MEMORY CURSOR RIGHT JMP CEBM ;TRY AGAIN ; CEBM1 RTS ; ; ; CBBM LDA L1+1 ;CURSOR LEFT UNTIL AT BEGINNING BEQ CBBM1 JSR CURLM JMP CBBM ; CBBM1 RTS EJECT ; **** HOME LINE CURSOR IS ON **** ; ; EPHL JSR CURBL ;MOVE CURSOR TO BEGINNING OF LOGICAL LINE COPYW BEGDIS,BEGFRE ;POINT SCREEN TO CURSOR LDX #0 STX BEGCOL STX BEGTFG INX STX ROWCUR RTS EJECT ; **** HOME MISC. POINTERS ROUTINE **** ; ; EPHPT LDY #1 ;SET CURSOR TO HOME POSITION STY ROWCUR STY COLCUR ; DEY ;ADJUST SCREEN DISPLAY VARIABLES TO HOME STY SAVLOG STY BEGCOL STY BEGTFG ; LDA #$80 ;CURSOR IS AT REAL LOCATION STA ATREAL RTS EJECT ; **** INSERT CHARACTER AT L3-1 IF FITS **** ; ; INSRM LDX BEGFRE ;MAKE SURE FREE MEMORY AVAILBLE CPX ENDFRE BNE INSRM1 ;BRANCH IF AVAILABLE LDX BEGFRE+1 CPX ENDFRE+1 BNE INSRM1 ;BRANCH IF AVAILABLE ; PLA ;RETURN TO INSERT-MODE INTERPRETER - NOT ROUTINE PLA LDY #MFERRM JMP DISERR ;MEMORY FULL ERROR ; INSRM1 LDY L3+1 ;IF (L3EQUL4EQU0) THEN L3 EQU UMEMHI BNE INSRM4 ;L4 EQU UMEMHI ; LDY UMEMHI STY L3 STY L4 LDY UMEMHI+1 STY L3+1 STY L4+1 BNE INSRM5 INSRM4 LDY L3 ;L3 EQU L3 - 1 BNE INSRM3 DEC L3+1 INSRM3 DEC L3 ; INSRM5 LDY #0 STA (ENDFRE),Y ;INSERT CHARACTER AFTER CURSOR ; LDX ENDFRE ;ENDFRE EQU ENDFRE - 1 BNE INSRM2 DEC ENDFRE+1 INSRM2 DEC ENDFRE ; RTS EJECT ; **** FIND LAST CR BEFORE CURSOR **** ; ; FINLCR LDA L2 ;COPY L2 TO TEMP LDY L2+1 BEQ Z0 ;SPECIAL CASE STA TEMP1 ;ALTERNATE ENTRY POINT STY TEMP2 LDY #0 ; Z3 LDA (TEMP1),Y ;FETCH CHAR. CMP #CR BEQ Z0 ;BRANCH IF FOUND PREVIOUS CR FINLC3 LDA TEMP1 ;DOUBLE BYTE DECREMENT TEMP L2 BNE Z2 DEC TEMP2 Z2 DEC TEMP1 JMP Z3 ; Z0 LDX #0 RTS ;ALL DONE -- EXIT EJECT ; **** WHAT LOGICAL COLUMN IS CHAR. AT ROUTINES **** ; ; WHATCL JSR FINLCR ;FIND LAST CR WHATC1 LDX #$FF STX TEMP5 ;SEARCH UNTIL AT CURSOR NOT UNTIL SPEC. COLUMN INX ;X-REG EQU 0 WHATC2 LDA L2+1 ;TEST IF DONE BEQ Z8 ;SPECIAL CASE (L1EQUL2EQU0) CPX TEMP5 ;CHECK IF MET COLUMN LIMIT BEQ Z6 ;JUMP CMP TEMP2 BNE Z4 LDA TEMP1 CMP L2 BEQ Z8 Z4 INC TEMP1 ;INCREMENT POINTER TO NEXT CHAR. BNE Z5 INC TEMP2 Z5 INX ;INCREMENT LOGICAL COLUMN COUNTER LDA (TEMP1),Y ;FETCH CHAR CMP #CR ;IF FOUND CR THEN SPECIAL CASE OF SCROLL BNE Z10 WHATC3 LDX #0 Z6 INC TEMP1 BNE Z9 INC TEMP2 BNE Z9 ; Z10 BIT TABFAK BMI WHATC2 ;BRANCH IF TAB IS NORMAL CHAR. CMP #TAB BNE WHATC2 ;BRANCH IF NORMAL CHAR BEQ Z11 ;JUMP - TAB ALWAYS SKIPS FIRST COLUMN ; Z7 INX Z11 STX TEMP3 ;CALC COLUMNS TAKEN BY A TAB INX TXA JSR BITGET LDX TEMP3 BCS WHATC2 CPX TEMP5 ;CHECK IF MET COLUMN LIMIT BNE Z7 ;BRANCH IF CONTINUE DEY INC TEMP1 ;BEGDIS WHILE IN IMAG. TAB SHOULD START CHAR. AFTER BNE Z9 ;BEGDIS EQU BEGDIS + 1 INC TEMP2 Z9 CPX #$FF ;TEST IF COUNTING COLUMNS OR FINDING ADDRESS BEQ Z8 ;BRANCH IF COUNTING COLUMNS STY BEGTFG ;DISPLAY STARTS IN MIDDLE OF TAB STX BEGCOL ;DISPLAY STARTS WITH THIS COLUMN LDA TEMP1 ;DISPLAY STARTS AT THIS ADDRESS STA BEGDIS LDA TEMP2 STA BEGDIS+1 Z8 STX TEMP3 ;SAVE RESULT IN TEMP3 & X-REG STX TEMP6 ;SAVE ANSWER FOR QUICK CURSOR LEFT/UP RTS EJECT ; **** FIND # COLUMNS AFTER CURSOR UNTIL CR **** ; ; FINNCL LDY #0 LDA (L3),Y CMP #CR BEQ FINNC5 ;IF JUST A CR THEN IT ADDS NO LENGTH LDA L2 ;SAVE L2 PHA LDA L2+1 PHA ; LDA L3 ;TEMP1 EQU L3 STA TEMP1 ;L2 EQU L3 STA L2 LDA L3+1 STA TEMP2 STA L2+1 ; FINNC1 INC L2 ;POINT AT NEXT CHARACTER BNE FINNC2 INC L2+1 ; FINNC2 LDY #0 LDA (L2),Y ;GET CHARACTER CMP #CR ;TEST IF CR BNE FINNC1 ;BRANCH IF STILL LOOKING FOR CR ; LDA L2 ;L2 EQU L2 - 1 BNE FINNC3 DEC L2+1 FINNC3 DEC L2 ; LDA TEMP1 ;T1EQUT1-1 BNE FINNC4 DEC TEMP2 FINNC4 DEC TEMP1 ; LDA #$FF STA TEMP5 ;SET 255 MAX JSR WHATC2 ;CALC # COLUMNS IN NEXT LINE ; PLA ;RECOVER L2 STA L2+1 PLA STA L2 FINNC5 RTS EJECT ;LIST ; **** READ SUBROUTINES **** ; ; CALCH LDA ENDFRE+1 ;CALC 1/2 OF AVAILABLE FREE RAM CLC SBC BEGFRE+1 BCC CALCH1 ; LSR A BEQ CALCH1 CLC ADC BEGFRE+1 STA RTEMP2 ;SAVE ANSWER IN RTEMP2 ; LDA #0 STA COMC1 STA COMC2 ;ZERO COMMAND REPEAT COUNTER (COMMON CODE) ; RTS ; CALCH1 LDY #MFERRM JMP DISERR ;DISPLAY "MEMORY FULL" ERROR & ABORT COMMAND ; ; ; ; GETLIN LDA #GETREC ;GET-LINE ROUTINE READS IOCB AND INSERTS LINE INTO BUFFER STA ICCOM,X ;...TEMP1 CONTAINS STATUS OF READ LDA #LOW CTSBUF STA ICBAL,X LDA #HIGH CTSBUF STA ICBAH,X LDA COLLMT STA ICBLL,X LDA #0 STA ICBLH,X JSR DISKIO ;READ THE FILE ; BPL GETLN1 ;BRANCH IF NORMAL STATUS CPY #136 BEQ GETLN1 ;DON'T DISPLAY EOF AS AN ERROR CPY #137 ***************************************************************************** BEQ GETLN8 JSR DISOER JMP GETLN1 GETLN8 LDY #$02 JSR DISOER **************************************************************************** LDY #1 GETLN1 STY RTEMP3 ;SAVE ADJUSTED READ STATUS IN TEMP1 ; LDA #CR ;MAKE SURE RECORD ENDS WITH A CR LDY ICBLL,X STA CTSBUF,Y ; BEQ GETLN4 ;BRANCH IF NULL READ ; INCW COMC1 ;BUMP COMMAND REPEAT COUNTER EACH READ ; LDA #$FF STA RTEMP1 ;INIT CHARACTER-TO-INSERT POINTER ; GETLN2 INC RTEMP1 LDY RTEMP1 LDA CTSBUF,Y ;GET NEXT CHARACTER FROM READ-BUFFER JSR GETLN5 ;INSERT CHARACTER INTO EDIT-BUBBLE-BUFFER BMI GETLN3 ;BRANCH IF CHARACTER INSERTED OK ; LDY #LLERRM ;LINE WAS TOO LONG - IGNORE REST OF IT JSR DISOER ;DISPLAY THE ERROR LDA #CR ;INSERT ENDING CR INTO EDIT-BUFFER JSR GETLN5 JMP GETLN4 ;ALL DONE WITH THIS RECORD ; GETLN3 LDY RTEMP1 LDA CTSBUF,Y CMP #CR BNE GETLN2 ;BRANCH TO FINISH INSERTING RECORD ; GETLN4 RTS ; GETLN5 JSR INSRM ;STRIPPED DOWN VERSION OF CHARACTER INSERT CMP #CR BNE GETLN7 ;RETURN WITH BMI - INSERTED OK JMP INSSC1 ;MOVE CURSOR & RETURN WITH BMI - INSERTED OK ; GETLN7 LDX SAVLOG JSR FINNCL ;CALC NEW LINE LENGTH CPX COLLMT ;TEST AGAINST MAXIMUM LINE LENGTH BCS GETLN6 ;BRANCH IF LINE WAS TOO LONG ; JMP INSSC1 ;MOVER CURSOR & RETURN WITH BMI - INSERTED OK ; GETLN6 JSR DELRM ;LINE TOO LONG - REMOVE CHARACTER LDA #0 RTS ;SET BPL ;NOLIST EJECT ; **** DISPLAY & BEEP ERRORS ROUTINE **** ; ; DISERR JSR DISOER ;DISPLAY ERROR & BEEP JSR EPDCW ;RE-DISPLAY COMMAND WINDOW W/O CURSOR JMP COMMND ;ABORT COMMAND AND AWAIT NEW ONE ; DISOER PHA ;DISPLAY ERROR MESSAGE & BEEP TXA PHA TYA PHA BPL ERRINT ;BRANCH IF INTERNAL EDIT ERROR (NOT I/O) STY FRO ;SETUP ERROR NUMBER IN FRO FOR CONVERTSION LDY #0 STY FRO+1 JSR IFP ;CONVERT INTEGER TO F.P. NUMBER JSR FASC ;CONVERT F.P. NUMBER TO ATASCI STRING ; LDY #$FF ;MOVE ERROR NUMBER STRING TO ERROR TABLE MOVESR INY LDA (INBUFF),Y ;FETCH CHAR. STA ERRNUM,Y ;MOVE CHAR. BPL MOVESR ;BRANCH IF MORE CHARS. ; LDY #IOERRM ERRINT LDA ERRTL,Y ;POINT TO ERROR TEXT STA TEMP13 LDA ERRTH,Y STA TEMP14 JSR CEW ;CLEAR ERROR WINDOW ; LDY #5 ;Y-REG HAS ERROR-WINDOW MARGIN MOVERR LDA (TEMP13),Y ;FETCH CHAR. PHP ORA #$80 TAX LDA INTTAB,X STA (EPOINT),Y INY INX PLP BPL MOVERR ; JSR BELL ;RING KEYBOARD BELL ; LDX #1 ;SET FOR APPOX. 4 SECONDS PLA ;RECOVER NAME (NUMBER) OF ERROR PHA CMP #SPERRM BNE DISEM ;BRANCH TO DISPLAY ERROR MESSAGE - NOT SEARCH PROMT LDX #0 ;TURN OFF AUTO-CLEAR TIMER FOR SEARCH PROMPT DISEM LDY #0 LDA #4 STA CDTMF4 JSR SETVBV ;SET UP AUTO-ERROR-WINDOW-CLEAR TIMER ; PLA ;RECOVER REGISTERS TAY PLA TAX PLA RTS ; CEW LDY #39 ;ENTRY POINT FOR CLEARING ERROR WINDOW LDA #$80 ; CEWLOP STA (EPOINT),Y ;CLEAR WINDOW DEY BPL CEWLOP RTS ; ; ; ; CLICK LDX #1 ;KEYBOARD CLICK SOUND STX ATRACT ;RESET ATTRACT TIMER (WELL ALMOST...) BNE BELL1 ; BELL LDX #BELLEN ;RING KEYBOARD BELL ROUTINE BELL1 LDY #$7F ;(O.S. TYPE KEYCLICK) BELL2 STY CONSOL STY WSYNC DEY BNE BELL2 DEX BNE BELL1 RTS ; EPDCOM LDA COMC1 ;ENTRY POINT FOR "DECREMENT COMMAND REPEAT COUNTER" ROUTINE BNE DCOM1 DEC COMC2 DCOM1 DEC COMC1 CLC LDA COMC1 ORA COMC2 BEQ DCOM2 SEC DCOM2 RTS EJECT ; **** BITGET ROUTINE FROM O.S. **** ; ; BITGET PHA AND #7 TAX LDA MASKTB,X STA TEMP4 PLA LSR A LSR A LSR A TAX LDA TABMAP,X AND TEMP4 CLC BEQ BITGE1 SEC BITGE1 RTS ; ; EPNCK CMP COMC1 ;ENTRY POINT FOR "CHECK N RANGE" BCC NCK1 ;BRANCH IF RANGE EXCEEDED LDA COMC2 BNE NCK1 ;BRANCH IF RANGE EXCEEDED RTS ; NCK1 LDY #NOERRM JMP DISERR ;DISPLAY "NUMBER TOO BIG" ERROR & ABORT COMMAND ; ; ; UPCASE CMP #$20+'A' ;THIS ROUTINE CONVERTS TO UPPER CASE IF NEEDED BCC UPCAS1 ;BRANCH IF NOT LOWWER CASE A-Z CMP #$21+'Z' BCS UPCAS1 ;BRANCH IF NOT LOWWER CASE A-Z ; SBC #31 ;CONVERT TO UPPERCASE A-Z ; UPCAS1 RTS ; ; ; DELAY LDY #120 ;DELAY 2 SECONDS ; DELAY1 LDX #0 ;SET UP SYSTEM TIMER ACCORDING TO Y-REG STX CDTMV3 ;...SO E: CAN SET UP DISPLAY STX CDTMV3+1 LDA #3 STA CDTMF3 JSR SETVBV WAITEC LDA CDTMF3 BNE WAITEC ;WAIT FOR TIMER TO GO "DING" ; RTS ; ; ; KEYTIM LDA KTVAL ;UPON KEYBOARD TIME-OUT, FORCE CHARACTER STA CH RTS ; ; ; EPTCHR CMP #'0' ;ENTRY POINT FOR "TEST CHARACTER FOR ALPHA-NUMERIC" BCC TCHR1 ;BRANCH IF NOT ALPHA-NUMERIC CMP #'9'+1 BCC TCHR2 ;BRANCH IF NUMERIC ; EPTAZ CMP #'A' BCC TCHR1 ;BRANCH IF NOT ALPHA-NUMERIC CMP #'Z'+1 BCC TCHR2 ;BRANCH IF ALPHA ; TCHR1 SEC ;CARRY SET MEANS ERROR TCHR2 RTS EJECT ; **** MOVE SUBROUTINE **** ; ; ; ; BMOVE IFLT MOVEL,MOVEF,BMOVE4 ;ENTRY POINT FOR "BLOCK MOVE" ROUTINE LDY #0 IFLT MOVEF,MOVETO,BMOVE2 ;BRANCH TO BMOVE2 IF BACKWARDS MOVE ; BMOVE1 LDA (MOVEF),Y STA (MOVETO),Y ;MOVE BYTE ; IFEQ MOVEF,MOVEL,BMOVE4 ;BRANCH TO BMOVE4 IF DONE ; INCW MOVEF ;ADVANCE TO NEXT BYTE INCW MOVETO; JMP BMOVE1 ;REPEAT... ; BMOVE2 COPYW TEMP1,MOVEL ;POINT MOVE TO END OF DEST'S BLOCK SUBWW TEMP1,MOVEF ADDWW MOVETO,TEMP1 ; BMOVE3 LDA (MOVEL),Y STA (MOVETO),Y ;MOVE BYTE ; IFEQ MOVEL,MOVEF,BMOVE4 ;BRANCH TO BMOVE4 IF DONE ; DECW MOVEL ;RETREAT TO PRIOR BYTE DECW MOVETO JMP BMOVE3 ;REPEAT... BMOVE4 RTS EJECT ; **** DEFINE BLOCK SUBROUTINE **** ; ; EPDB LDA #'/' ;ENTRY POINT FOR "DEFINE BLOCK" ROUTINE STA SDELIM ;SLASH IS MARKER STRING DELIMITER COPYWI BS3,MARKER ;POINT TO BLOCK MARKER STRING TO SEARCH FOR ; JSR EPSB ;LOOK FOR 1ST MARKER BCC DB1 ;BRANCH IF CAN'T FIND 1ST MARKER ; COPYW BFIRST,BS1; SUBWB BFIRST,#BMLEN-1 ;POINT BFIRST TO BEGINNING OF BLOCK ; JSR EPSB10 ;LOOK FOR 2ND BLOCK MARKER BCC DB1 ;BRANCH IF CAN'T FIND 2ND BLOCK MARKER ; COPYW BLAST,BS1 ;POINT BLAST TO END OF BLOCK ADDWB BNCHAR,#BMLEN ;COUNT 1ST MARKER IN #CHARS IN BLOCK INCW BNLINE ;COUNT 1ST MARKER IN #LINES IN BLOCK RTS ; DB1 LDY #CFERRM ;CAN'T FIND BLOCK MARKER ERROR JMP DISERR ;DISPLAY ERROR & ABORT EJECT ; **** FREE RAM CHECKS **** ; ; EPMCK LDX BEGFRE ;ENTRY POINT FOR "FREE MEMORY CHECK" STX TEMP13 LDX BEGFRE+1 INX STX TEMP14 ; IFLT ENDFRE,TEMP13,MCK1 ;ENTRY POINT FOR "FREE MEMORY CHECK" RTS ; MCK1 LDY #MFERRM ;DISPLAY MEMORY FULL ERROR & ABORT COMMAND JMP DISERR ; ; EPBRAM COPYW TEMP1,ENDFRE ;ENTRY POINT FOR "WILL BLOCK FIT IN FREE RAM" ROUTINE SUBWW TEMP1,BEGFRE IFLT BNCHAR,TEMP1,BRAM1 ;BRANCH TO BRAM1 IF ???? ; LDY #MFERRM JMP DISERR ;DISPLAY MEMORY FULL ERROR & ABORT ; BRAM1 RTS EJECT ; **** WHICH HALF(S) IS BLOCK IN **** ; ; EPWHB LDA L1+1 ;ENTRY POINT FOR "WHICH HALF(S) BLOCK IS IN" ROUTINE SEC BEQ WHB1 ;BLOCK IS IN L3-L4 ; LDA L3+1 CLC BEQ WHB1 ;BLOCK IS IN L1-L2 ; LDA BLAST CMP BEGFRE LDA BLAST+1 SBC BEGFRE+1 LDA #0 BCC WHB1 ;BLOCK IS IN L1-L2 ; LDA BFIRST CMP L3 LDA BFIRST+1 SBC L3+1 LDA #0 BCS WHB1 ;BLOCK IS IN L3-L4 ; LDA #$FF ;BLOCK IS IN BOTH L1-L2 AND L3-L4 ; WHB1 RTS EJECT ; **** SEARCH BUFFER ROUTINE **** ; ; EPSB LDA L1+1 ;ENTRY POINT FOR "SEARCH ENTIRE BUFFER" ROUTINE BEQ EPSB1 ;BRANCH IF NO TEXT BEFORE CURSOR COPYW BS1,L1; JMP SB2 ;START AT BEGINNING OF BUFFER ; EPSB1 LDA L3+1 ;ENTRY POINT FOR "SEARCH AFTER CURSOR" ROUTINE BNE SB13 ;BRANCH IF THERE ISN'T ANY TEXT ANYWHERE JMP SB7 SB13 COPYW BS1,L3 ;START AT TEXT AFTER CURSOR ; SB2 COPYWI BNCHAR,0 ;ENTRY POINT FOR "CONTINUE SEARCH" COPYWI BNLINE,0 COPYW RTEMP1,BS1 ;INIT "LAST START" COPYW RTEMP3,BNCHAR ;INIT "LAST BNCHAR" COPYW RTEMP5,BNLINE ;INIT "LAST BNLINE" LDY #0 LDX #0 LDA (BS3),Y CMP SDELIM BEQ SB8 ;BRANCH IF NULL SEARCH STRING- SEARCH SUCCESFULL ; SB3 JSR SB12 ;BUMP BNCHAR AND MAYBE BNLINE PHA ;SAVE CHARACTER LDA #WCCHAR CMP (BS3),Y BEQ SB9 ;BRANCH IF WILDCARD CHARACTER PLA CMP (BS3),Y ;DOES IT MATCH STRING WERE LOOKING FOR BEQ SB5 ;BRANCH IF IT MATCHES COPYW BS1,RTEMP1 ;RECOVER "LAST START" COPYW BNCHAR,RTEMP3 ;RECOVER "LAST BNCHAR" COPYW BNLINE,RTEMP5 ;RECOVER "LAST BNLINE" JSR SB12 ;BUMP BNCHAR AND MAYBE BUMP BNLINE JSR SB11 ;ADVANCE TO NEXT CHARACTER BCC SB7 ;BRANCH IF SEARCH FAILED COPYW RTEMP1,BS1 ;SAVE NEW "LAST START" COPYW RTEMP3,BNCHAR ;SAVE NEW "LAST BNCHAR" COPYW RTEMP5,BNLINE ;SAVE NEW "LAST BNLINE" LDY #0 BEQ SB3 ;CONTINUE SEARCHING ; SB5 INY LDA (BS3),Y CMP SDELIM BEQ SB8 ;BRANCH IF SEARCH COMPLETE ; JSR SB11 ;ADVANCE POINTERS BCS SB3 ;LOOK AT NEXT CHARACTER ; SB7 CLC RTS ;SEARCH FAILED - CARRY CLEAR ; SB8 SEC RTS ;SEARCH SUCCESSFULY - CARRY SET ; SB9 PLA JMP SB5 ;CONTINUE SEARCH ; EPSB10 JSR SB11 ;ENTRY POINT FOR "CONTINUE SEARCH BUFFER " ROUTINE BCC SB7 ;ADVANCE POINTER - BRANCH IF SEARCH FAILED JMP SB2 ;CONTINUE SEARCH ; ;SB11 IFNE BS1,L2,SB6 ;BRANCH TO SB6 IF AT END OF L1EQUL2 SB11 LDA BS1 ;BRANCH TO SB6 IF AT END OF L1EQUL2 ** WAS MACRO, BUT OUT OF SYMBOLS CMP L2 BNE SB6 LDA BS1+1 CMP L2+1 BNE SB6 ; LDA L3+1 BEQ SB7 ;BRANCH IF SEARCH FAILED COPYW BS1,L3; JMP SB8 ;LOOK AT NEXT CHARACTER ; SB6 IFEQ BS1,L4,SB7 ;BRANCH TO SB7 IF SEARCH FAILS INCW BS1; JMP SB8 ;LOOK AT NEXT CHARACTER ; ; SB12 INCW BNCHAR ;WE WILL SOON PASS A CHARACTER LDA (BS1,X) CMP #CR BNE SB4 INCW BNLINE ;WE PASSED A CR ; SB4 RTS EJECT ; **** SET-UP DISPLAY AFTER SEARCH **** ; ; EPSET JSR EPHPT ;ENTRY POINT FOR "SETUP DISPLAY" COMMAND ;HOME DISPLAY POINTERS COPYW TEMP1,BNCHAR SET1 LDA TEMP1 ORA TEMP1+1 BEQ SET2 ; JSR CURRM ;MOVE BUBBLE TO RIGHT N TIMES DECW TEMP1; JMP SET1 ; SET2 JSR FINLCR ;FIND CR BEFORE LAST CHAR OF SEARCH STRING COPYW BEGDIS,TEMP1; INCW BEGDIS ;POINT DISPLAY TO LINE CURSOR IS ON JSR WHATC1 STX SAVLOG ;SAVE NEW COLUMN OF CURSOR ; SET3 CPX #0 BEQ SET4 JSR MOVSCR DEX JMP SET3 ; SET4 RTS EJECT ; **** SEARCH/REPLACE/VERIFY ROUTINES **** ; ; EPSRV STA BS6 ;ENTRY POINT FOR "SEARCH/REPLACE/VERIFY" SUBROUTINES LDA TEMP5 ;SAVE SEARCH CODE IN BS6 STA BS5 ;SAVE REPLACE STRING POINTER (IF ANY) IN BS5 LDA #LOW INBUF ;POINT BS3 TO SEARCH STRING CLC ADC TEMP4 STA BS3 LDA #HIGH INBUF ADC #0 STA BS4 ; COPYWI TEMP9,INBUF ;POINT TO COMMAND LINE IN CASE OF SEARCH WITH REPLACE ; EPSRV1 JSR EPSB1 ;SEARCH AFTER CURSOR JMP SRV3 ; JSR EPSB10 ;CONTINUE SEARCH AFTER CURSOR SRV3 BCS SRV6 ;BRANCH IF SEARCH SUCCESSFUL ; LDA BS6 LSR A BCS SRV5 ;BRANCH IF SEARCH-FILE TYPE SEARCH ; LSR A BCC SRV4 ;BRANCH IF SUPPOSE TO REPORT SEARCH FAILED ERROR RTS ; SRV4 LDY #SFERRM ;SEARCH FAILED JMP DISERR ;DISPLAY ERROR + EXIT ; SRV5 BIT EOFLAG BMI SRV4 ;BRANCH IF AT EOF-SEARCH FAILS ; JSR CEBS ;MOVE CURSOR TO END OF BUFFER ****************************************************************************** LDA COMC1 PHA LDA COMC2 PHA JSR WRITUC ;WRITE OUT BUFFER JSR EPCIH ;READ IN NEW BUFFER PLA STA COMC2 PLA STA COMC1 JMP EPSRV1 ;SEARCH THRU NEW BUFFER ***************************************************************************** ; SRV6 JSR EPSET BIT BS6 BMI SRV14 ;BRANCH IF SEARCH/REPLACE-TYPE SEARCH BVC SRV12 ;BRANCH IF SEARCH-ONLY-TYPE SEARCH ; JSR DISPLY ;SHOW USER STRING FOUND LDY #SPERRM ;PROMPT USER IN ERROR WINDOW JSR DISOER LDA #0 ;PUT PROMPT CURSOR IN ERROR WINDOW LDY #32 STA (EPOINT),Y ; SRV7 JSR EPRCH ;REMOVE ANY PRE-MATURE KEYSTOKE LDX KEYBD ;GET USER KEYSTROKE JSR CIO BMI SRV7 JSR UPCASE ;CONVERT TO UPPERCASE TAX LDA INTTAB,X ;ECHO CHARACTER LDY #32 STA (EPOINT),Y INY ;ECHO PROMPT CURSOR LDA #0 STA (EPOINT),Y TXA ;TEST IF RESPONSE VALID SEC SBC #'Q' CMP #3 BCC SRV8 ;BRANCH IF VALID RESPONSE ; LDA #$9F ;DISPLAY ERROR CURSOR + TRY AGAIN STA (EPOINT),Y JSR BELL JMP SRV7 SRV8 PHA JSR CEW ;CLEAR ERROR WINDOW PLA BEQ SRV13 ;BRANCH IF QUITTING SEARCH CMP #2 BEQ SRV12 ;BRANCH IF SKIPPING ; SRV14 PUSHCC ;REPLACE SEARCH STRING WITH REPLACE STRING LDY #0 ;SET COMMAND REPEAT COUNTER TO ZERO STY COMC1 STY COMC2 ; SRV9 LDA (BS3),Y ;PLACE LENGTH OF SEARCH STRING IN COMC1/C2 CMP SDELIM BEQ SRV10 INY INC COMC1 JMP SRV9 ; SRV10 LDA COMC1 ORA COMC2 BEQ SRV11 ;DON'T DELETE IF NULL SEARCH STRING JSR COMDB ;DELETE (TO LEFT) THE SEARCH STRING ***************************************************************************** ; SRV11 INC COMC1 ***************************************************************************** LDA BS5 ;RECOVER OFFSET TO REPLACE STRING JSR EPCIT1 ;INSERT THE REPLACEMENT STRING PULLCC ;RECOVER COMMAND REPEAT COUNTER FROM STACK ; SRV12 JSR EPDCOM ;DECREMENT COMMAND REPEAT COUNTER BCC SRV13 JMP EPSRV1 ;REPEAT SEARCH COMMAND ; SRV13 RTS EJECT ; **** CONVERT TAB TO SPACES SUBROUTINE **** ; ; EPCTS LDY #0 ;ENTRY POINT FOR "CONVERT TAB TO SPACES" ROUTINE LDX #0 ; CTS1 LDA (TEMP1),Y ;GET CHARACTER STA CTSBUF,X ;PUT CHARACTERS IN BUFFER CMP #CR ; BEQ CTS4 ;BRANCH IF CHARACTERS CR (ALL DONE) ; BIT TEMP11 ;IF WRITING TO DISK, DON'T EXPAND TABS BMI CTS2 ;BRANCH BECAUSE DISK BIT TABFAK BMI CTS2 ;BRANCH IF O.S. TABS SELECTED INSTEAD EXP. TABS CMP #TAB BEQ CTS3 ;BRANCH IF FOUND AN EXPANDING CTS2 INX ;ADVANCE POINTERS TO NEXT CHARACTER CTS5 JSR ADV JMP CTS1 ;REPEAT UNTIL FIND CR ; CTS3 LDA #' ' ;EXPAND TAB WITH BLANKS STA CTSBUF,X ;PUTCHAR IN BUFFER INX TXA PHA INX TXA JSR BITGET ;TEST FOR NEXT TABSTAB PLA TAX BCC CTS3 ;BRANCH IF STILL IN TAB BCS CTS5 ;JUMP TO START NEXT CHARACTER AFTER TAB ; CTS4 RTS ;FOUND CR-EXIT EJECT ; **** ADVANCE TO NEXT CHARACTER **** ; ; ADV IFEQ TEMP1,L2,ADV1 ; INCW TEMP1 RTS ; ADV1 COPYW TEMP1,L3 RTS EJECT ; **** IN BETWEEN CURSOR SUBROUTINE **** ; ; ;THIS ROUTINE WRITTEN BY MIKE ALBAUGH FOR TWO ;SIX-PACKS OF BEER. MIKE ALBAUGH'S IMPROVEMENT ;WAS TO ADD AN EXTRA SCAN LINE ABOVE & BELOW ;THE LINE THE CURSOR WAS ON. THIS WAS DONE ;SO THAT THE CURSOR WOULD NOT "HIDE" WHEN ;SURROUNDED WITH INVERSE VIDEO CHARACTERS. ; ;THIS ROUTINE MODIFIES THE NORMAL DISPLAY LIST ;CREATED BY THE O.S. TO ADD IN THE EXTRA SCAN ;LINES. THE CURSOR IS A GRAPHICS PLAYER #3. ;THIS ROUTINE TAKES THE ROW,COLUMN COORDINATES ;AND PLACES THE GRAPHICS "I" CURSOR JUST TO THE ;LEFT OF THE PLACE THE CHARACTER IN THAT ;LOCATIN WOULD GO. ; ; ;CALL WITH A=COLUMN (1-40) ; X=ROW (1-24) ;IF X=0, WILL KILL CURSOR FOR EXIT ;"SIDE-DOOR" ENTRY AT CURH FOR ;SETTING H-POSN ONLY ;BLITZES A,X,Y LOCNS CB-CE ;USES 2 BYTES OF STACK + JSR ;!!THIS ROUTINE ASSUMES A NORMAL ; GRAPHICS O DISPLAY-LIST ALREADY ; EXISTS!!! ; MCURS PHA ;SAVE H TXA ;CHK V BNE TPRP ;OK, DO IT STA GRACTL ;ELSE CLEAN UP STA GRAFP3 PLA ;ADJUST STACK RTS TPRP PHA ;SAVE V LDA DLISTL ;PTR TO D-LIST CMP #$20 ;ALREADY PREP'D? BNE CURP ;YES, JUST POSN LDY #0 STY SDMCTL STY DMACTL ;TURN OFF ANTIC SEC SBC #2 ;MOVE DOWN STA DLISTL STA TEMP3 LDA DLISTL+1 SBC #0 STA DLISTL+1 STA TEMP4 LDA #$60 STA (TEMP3),Y LDA #$70 INY STA (TEMP3),Y INY STA (TEMP3),Y LDA #$42 INY STA (TEMP3),Y LDA SAVMSC INY STA (TEMP3),Y LDA SAVMSC+1 INY STA (TEMP3),Y LDA #0 INY STA (TEMP3),Y LDA #2 INY STA (TEMP3),Y LDY #$20 LDA TEMP3 STA (TEMP3),Y ;PATCH JVB LDA TEMP4 INY STA (TEMP3),Y AND #$0F8 CLC ADC #3 STA MEMTOP+1 LDA #$7F STA MEMTOP ;SET TO BELOW PLAYER #3 LDA #$2E ;DMA WITH 2X PLAERS STA SDMCTL STA DMACTL LDA #3 STA GRACTL LSR A ;MAKE A 1 STA GPRIOR ;FALL THROUGH TO POSITION CURSOR CURP PLA ;GET V BACK PHA ;SAVE V TAX LDA DLISTL STA TEMP3 LDA DLISTL+1 STA TEMP4 ;PT TO DLIST DEX ;ADJUST & TEXT BNE SP01 ;#0 SPECIAL DEX LDA #$70 BNE SP02 SP01 LDA #$60 SP02 LDY #2 STA (TEMP3),Y TXA BPL SP00 LDA #$1E-5 SP00 CLC ADC #5 ;"1ST" LINE STA TEMP1 TXA CLC ADC #7 ;2ND LINE STA TEMP2 LDY #$1E SPLP LDA #2 CPY TEMP1 BNE SP11 LDA #0 SP11 CPY TEMP2 BNE SP12 LDA #0 SP12 STA (TEMP3),Y DEY CPY #5 BNE SPLP ;NOW UPDATE CURSOR LDA TEMP4 AND #$0F8 STA PMBASE CLC ADC #3 STA TEMP4 LDA #$80 STA TEMP3 ;PT TO PL#3 LDY #$0 TYA CVLP0 STA (TEMP3),Y INY BPL CVLP0 ;CLEAR STRIP PLA ;GET ROW # ASL A ASL A ;*4 ADC #$8B STA TEMP3 ;PT INTO STRIP LDY #4 CVLP1 LDA CRTBL,Y STA (TEMP3),Y DEY BPL CVLP1 PLA ;GET H BACK CURH ASL A ASL A ADC #$28 STA HPOS3 RTS CRTBL DB $38,16,16,16,$38 EJECT ; **** HANDY DANDY CIO SUBROUTINES **** ; ; SETDIO STA ICCOM,X ;FILL IN COMMAND BYTE FROM A-REG LDA #LOW [CTSBUF+1] ;POINT BUFFER TO CTSBUF STA ICBAL,X LDA #HIGH [CTSBUF+1] STA ICBAH,X JMP DISKIO ; ; ; ; ; CLOSCR LDX SCRFIL ;CLOSE THE SCRATCH IOCB ; CLODIO LDA #CLOSE ;FILL IN COMMAND BYTE AS A CLOSE FILE STA ICCOM,X JMP DISKIO ;HAVE CIO CLOSE THE IOCB ; ; ; ; GETFRE LDX #$10 ;FIND A FREE IOCB (SKIP IOCB #0) ; GETFR1 LDA ICHID,X ;GET IN-USE FLAG CMP #$FF ;$FF MEANS AVAILABLE BEQ GETFR3 ;BRANCH IF FOUND A FREE IOCB ; GETFR2 TXA ;INCREMENT X-REG TO NEXT IOCB IN-USE FLAG CLC ADC #16 ;ADD THE LENGH OF AN IOCB TO GET TO NEXT ONE TAX CMP #$80 ;STOP AT 8TH IOCB BNE GETFR1 ;BRANCH BACK TO LOOK FOR ANOTHER ; LDA #$FF ;NO FREE IOCB'S - RETURN "NE" STATUS GETFR3 RTS ;RETURN WITH X-REG EQU FREE IOCB # IF "EQ" STATUS ; ; ; CHKERR BPL CHKER1 ;RETURN IF NO ERROR CPY #170 ;DISPLAY CIO ERROR (EXCEPT 170'S) BEQ CHKER1 ;BRANCH TO IGNORE 170 ERROR (FILE NOT FOUND) JSR DISOER CHKER1 RTS ; ; ; EPRCH LDA #$FF ;CLEAR ANY KEYSTOKES ALREADY STRUCK STA CH RTS ; ; EPREF LDA #0 ;CLEAR EDITOR E: FLAGS (ESCAPE & START/STOP) STA SSFLAG STA ESCFLG RTS ; ; ; DISKIO JSR BREAKD ;DISABLE THE BREAK KEY ; JSR CIO ; PHP ;SAVE CIO STATUS PHA SEI ;RE-ENABLE THE BREAK KEY LDA POKMSK ORA #$80 STA POKMSK STA IRQEN CLI PLA PLP RTS ; BREAKD SEI ;BREAK KEY DISABLE LDA POKMSK AND #$7F STA POKMSK STA IRQEN CLI RTS EJECT ; **** FILENAME PARSE ROUTINE **** ; ; ;THIS ROUTINE PARSES A FILE SPEC IN THE FORM OF: ;-DN:FILENAME.EXT (N IS 1-8) ;-FILENAME.EXT ;THIS ROUTINE OUTPUTS IN THE FORM OF: ;-DRIVE #, FILENAME, EXTENSION ;CHECKING FOR VALID CHARACTERS IS DONE. ; ;-NAME BEGINS AT INBUF,X ;-FILESPEC WILL GO AT CTSBUF ;-IF FILENAME TOO LONG THEN CARRY SET ON RETURN ;-XREG POINTS TO TERMINATION CHARACTER ON RETURN ;-CONVERTS TO UPPER CASE ; ; ; FNPARS LDA #'1' ;ENTRY POINT FOR "FILENAME PARSE" SUBROUTINE STA CTSBUF ;INIT DEFAULT DRIVE NUMBER LDY #FNLEN+3-1 LDA #' ' ;INIT FILENAME AND EXTENSION TO BLANKS INITFN STA CTSBUF+1,Y DEY BPL INITFN ; STX TEMP1 ;SAVE OFFSET TO FILE SPEC LDA INBUF,X ;GET FIRST CHARACTER JSR UPCASE ;CONVERT TO UPPER CASE CMP #'D' BNE FDNAME ;BRANCH IF NOT A "D" - MUST BE START OF FILENAME ; LDA INBUF+1,X ;GET SECOND CHARACTER OF DEVICE CMP #'1' BCC FDNAME ;BRANCH IF REALLY FILENAME AFTER ALL CMP #';' BCS FDNAME ;BRANCH IF REALLY FILENAME AFTER ALL CMP #'9' BEQ FDNAME ;BRANCH IF REALLY FILENAME AFTER ALL INX INX INX CMP #':' BNE EXPDRV ;BRANCH IF DRIVE NUMBER EXPECTED NEXT DEX LDA #'1' ;"D:" - ASSUME DRIVE 1 ; EXPDRV LDY INBUF-1,X ;NEXT CHARACTER MUST BE A COLON TO BE DEVICE CPY #':' BNE ITSFN ;BRANCH IF REALLY FILENAME AFTER ALL STA CTSBUF ;SAVE DRIVE NUMBER AS FIRST CHARACTER AT CTSBUF ; FDNAME LDY #0 FDNAM1 LDA INBUF,X ;GET CHARACTER OF FILENAME JSR UPCASE ;CONVERT TO UPPER CASE CMP #'.' BEQ FDEXT ;BRANCH IF FOUND START OF EXTENSION CMP #',' BEQ FNEXIT ;BRANCH IF FOUND FILE SPEC TERMINATOR CMP SDELIM BEQ FNEXIT ;BRANCH IF FOUND FILE SPEC TERMINATOR ; JSR EPTCHR ;TEST FILENAME CHARACTER TO BE ALPHA-NUMERIC BCS FNBAD ;BRANCH IF BAD FILENAME ; STA CTSBUF+1,Y ;MOVE FILENAME CHARACTER INX INY CPY #FNLEN+1 ;CHECK FOR TOO LONG A FILENAME BNE FDNAM1 ;BRANCH BACK TO FINISH FILENAME ; FNBAD SEC ;FILENAME OR EXTENSION TOO LONG RTS ;RETURN WITH CARRY SET (ERROR) ; FNEXIT CLC LDA CTSBUF+1 ;GET FIRST CHARACTER OF FILENAME JSR EPTAZ ;TEST IF A-Z RTS ;RETURN WITH CARRY CLEAR (NO ERRORS) ; ITSFN LDX TEMP1 ;IT WAS REALLY FILENAME AFTER ALL JMP FDNAME ;RESET OFFSET BACK TO BEGINING ; FDEXT LDY #0 ;FOUND EXTIONSION INX FDEXT1 LDA INBUF,X ;GET CHARACTER OF EXTENSION JSR UPCASE ;CONVERT TO UPPER CASE CMP #',' BEQ FNEXIT ;BRANCH IF FOUND FILE SPEC TERMINATOR CMP SDELIM BEQ FNEXIT ;BRANCH IF FOUND FILE SPEC TERMINATOR CPY #3 BEQ FNBAD ;BRANCH IF TOO LONG OF EXTIONSION ; JSR EPTCHR ;TEST EXTENSION CHARACTER FOR ALPHA-NUMERIC BCS FNBAD ;BRANCH IF ILLEGAL CHARACTER IN EXTENSION ; STA CTSBUF+FNLEN+1,Y INX INY BNE FDEXT1 ;JUMP BACK TO FINISH EXTENSION ; ; ; CHKEXT LDY #3 ;CHECK FOR SPECIFIC EXTENSION CHKEX1 LDA CTSBUF+FNLEN,Y CMP FSPART-1,X BNE CHKEX2 DEX DEY BNE CHKEX1 ; CHKEX2 RTS EJECT ; **** MAKE FILESPEC FROM SUBPARTS SUBROUTINE **** ; ; ;THIS ROUTINE COMBINES A DRIVE #, FILENAME, & ;EXTENSION INTO A COMPLETE FILE SPEC IN THE ;FORM ",DN:FILENAME.EXT(EOL)". THE LEADING ;COMMA IS USED TO CONCATENATE A 2ND FILE ;SPEC TO THE FIRST ONE IN THE FORM USED BY ;THE RENAME COMMAND. THE FILE SPEC IS ;STORED AT CTSBUF. ALL BLANKS ARE REMOVED. ;-A HAS DRIVE # (BIT 7 IF RENAME OFFSET) ;-Y HAS OFFSET FROM FSPART TO FILENAME ;-X HAS OFFSET FROM FSPART TO EXTENSION ; ; MAKEFS STX TEMP7 ;SAVE OFFSET TO EXTENSION LDX #0 PHA ;SAVE DRIVE # AND #$80 BEQ MAKFS1 ;BRANCH IF NOT CONCATENATING FILE SPECS FOR RENAME LDX TEMP8 PLA ;WHO NEEDS IT? LDA #',' ;PUT IN COMMA FOR RENAME, BUT SKIP "DN:" STA CTSBUF,X INX BNE MAKFS6 ; MAKFS1 LDA #',' STA CTSBUF,X ;PUT COMMA IN BUFFER INX LDA #'D' STA CTSBUF,X ;PUT "D" IN BUFFER INX PLA ;RECOVER DRIVE NUMBER AND #$7F ;REMOVE RENAME FLAG IF PRESENT STA CTSBUF,X ;PUT DRIVE # IN BUFFER INX LDA #':' STA CTSBUF,X ;PUT COLON IN BUFFER INX ; MAKFS6 LDA #FNLEN ;MOVE FILENAME TO BUFFER STA TEMP8 ;OOPS - OUT OF REGISTERS MAKFS2 LDA FSPART,Y ;GET FILENAME CHARACTER CMP #' ' BEQ MAKFS3 ;BRANCH IF FINISHED FILENAME STA CTSBUF,X ;PUT FILENAME CHARACTER IN BUFFER INX INY DEC TEMP8 ;ONLY MOVE FNLEN CHARACTERS BNE MAKFS2 ;JUMP BACK & FINISH MOVING FILENAME ; MAKFS3 LDA #'.' STA CTSBUF,X ;PUT PERIOD IN BUFFER INX LDY TEMP7 ;RECOVER OFFSET TO EXTENSION LDA #3 STA TEMP8 ;OOPS - OUT OF REGISTERS ; MAKFS4 LDA FSPART,Y ;GET EXTENSION CHARACTER CMP #' ' BEQ MAKFS5 ;BRANCH IF EXTENSION FINISHED STA CTSBUF,X ;PUT EXTENSION CHARACTER IN BUFFER INY INX DEC TEMP8 BNE MAKFS4 ;BRANCH BACK TO FINISH MOVING EXTENSION ; MAKFS5 LDA #CR STA CTSBUF,X ;PUT EOL IN BUFFER STX TEMP8 ;SAVE POINTER FOR RENAME OFFSET NEXT TIME RTS EJECT ; **** MOVE MATH-PAC ASCII INTEGER NUMBER TO BUFFER **** ; ; MOVASC STA TEMP7 STY TEMP8 ; LDA #' ' ;FIRST, FILL BUFFER WITH BLANKS LDY #4 ;5 CHARACTERS MAX FOR INTEGER MOVAS1 STA (TEMP7),Y DEY BPL MOVAS1 INY ;YREG EQU ZERO ; MOVAS2 LDA (INBUFF),Y ;GET NUMBER TO MOVE BMI MOVAS3 ;BRANCH IF FOUND LAST DIGIT TO MOVE STA (TEMP7),Y ;PUT DIGIT IN BUFFER INY BNE MOVAS2 ; MOVAS3 AND #$7F ;REMOVE END-DIGIT FLAG STA (TEMP7),Y ;PUT LAST DIGIT IN BUFFER RTS EJECT ; **** DIRECTORY READ SUBROUTINE **** ; ; ;THIS ROUTINE OPENS THE DIRECTORY AND SEARCHES ;FOR A PARTICULAR FILES ATTRIBUTES. THIS ;ROUTINE ABORTS IF THE FILE IS LOCKED. THE ;FILESIZE AND FREE SPACE IS SAVED. ;-A HAS DRIVE # IN ATASCI ;-Y HAS OFFSET TO FILENAME ;-X HAS OFFSET TO EXTENSION ;-CARRY SET ON RETURN FOR LOCKED FILE ;-TEMP1&2 HAS FREE SPACE ON RETURN ;-TEMP3&4 HAS FILE SIZE ON RETURN ; ; CHLOCK JSR MAKEFS ;COMBINE FILE SPEC PARTS INTO COMPLETE FILE SPEC LDX SCRFIL LDA #6 STA ICAX1,X ;SET OPEN CODE FOR DIRECTORY READ LDA #OPEN JSR SETDIO ;SET UP CIO BMI FLERR ;BRANCH IF OPEN ERROR ; FLREAD LDX SCRFIL ;READ A DIRECTORY RECORD LDA #40 STA ICBLL,X ;ALLOW 40 CHARACTERS FOR DIRECTORY RECORD LDA #0 STA ICBLH,X LDA #GETREC STA ICCOM,X JSR DISKIO ;HAVE CIO READ DIRECTORY RECORD BMI FLERR ;BRANCH IF READ ERROR ; LDA CTSBUF+1 ;GET FIRST CHARACTER OF RECORD CMP #'*' BEQ LOCKED ;OH MY, IT IS LOCKED ; CMP #' ' BEQ SAVSIZ ;BRANCH IF DIRECTORY ENTRY RECORD ; LDA #0 ;SAVE FREE SPACE JSR ASCBIN ;CONVERT ATASCII TO BINARY STA TEMP1 ;SAVE FREE SPACE IN TEMP1 & 2 STY TEMP2 JSR CLOSCR ;CLOSE IOCB CLC RTS ;NORMAL RETURN ; SAVSIZ LDA #14 ;SAVE FILE SIZE JSR ASCBIN ;CONVERT ATASCII TO BINARY STA TEMP3 ;SAVE FILE SIZE IN TEMP3 & 4 STY TEMP4 JMP FLREAD ; LOCKED JSR CLOSCR ;CLOSE THE IOCB SEC RTS ;RETURN WITH CARRY SET - ERROR ; FLERR TYA PHA JSR CLODIO ;FREE THE IOCB PLA TAY PLA ;REMOVE RETURN ADDRESS PLA JMP REASKD ;DISPLAY ERROR AND RE-PROMT USER ; ; ASCBIN STA CIX ;SAVE OFFSET TO ATASCII NUMBER LDA #LOW [CTSBUF+1] STA INBUFF ;POINT TO BUFFER LDA #HIGH [CTSBUF+1] STA INBUFF+1 JSR AFP ;CONVERT ATASCII TO FP JSR FPI ;CONVERT FP TO INTEGER LDA FRO ;PUT INTEGER IN A AND Y REGS LDY FRO+1 RTS EJECT ; **** MULTIPLE COMMAND WINDOW SUBROUTINES **** ; ; SWAPCW LDY #120+3 ;ENTRY POINT FOR "SWAP COMMAND WINDOWS" SUBROUTINE ; SWAPC1 LDA INBUF-1,Y ;SWAP INBUF AND INBUF2 (INCLUDING RELATED DATA) LDX INBUF2-1,Y STA INBUF2-1,Y TXA STA INBUF-1,Y ;WHAT DO YOU MEAN NO STX ABSOLUTE,Y *'%&*$##* !!! DEY BNE SWAPC1 RTS EJECT ; **** PROGRAM INITIALIZATION **** ; ; ; BEGIN TSX ;SAVE O.S. STACK STX SAVEOS LDA #0 STA REOPFG ;INIT RE-OPEN FLAG STA COLDST ;SET O.S. FLAG SO SYSTEM-RESET BOOTS SYSTEM ; IF PROT ;ASSEMBLY IF PROTECTION WANTED LDA #HIGH SECSEC ;VERY QUICK & DIRTY READ HARD SECTOR STA $30B LDA #LOW SECSEC STA $30A ; LDA #LOW PEND STA $304 LDA #HIGH PEND STA $305 ; LDA #1 STA $301 ; LDA #$52 STA $302 ; JSR $E453 ; LDA PEND CMP #'H' BEQ *+5 ; JMP (DOSVEC) ENDIF ; IF PROT ;ASSEMBLY IF PROTECTION WANTED ;MES1 ;MES 3,30,E;FRED THORLIN ;MES 6,1,Y;DALE YOCUM ;MES 7,7,R;MACROTRONICS ;MES 3,25,R;SORCIM ;MES 5,26,A;MIKE EKBERG ;MES 18,12,P;TANDEM ;MES 5,33,A;MIKE LORENZEN ;MES 11,64,R;MIKE MURDOCK ;MES 9,13,H;BRIAN JOHNSTON ;MES 5,44,Y;LARRY SUMMERS ;MES 7,33,B;HARRY BROWN ;MES 3,12,M;PAM JONES ;MES 5,43,T;ECKSTROM ;MES 11,23,N;DAVE COMSTOCK ;MES 18,44,Z;STEVE TECOTZKY ;MES 10,17,W;STEVE BITTROLFF ;MES 3,64,L;KELCY ;MES 5,31,L;PAUL LAUGHTON ;MES 4,20,-;LISA BAILEY ;MES 10,91,T;CAROL ABBOTT ;MES 9,33,C;JOHN POWERS ;MES 2,16,Y;CYNTHIA RUSSELL ;MES 16,34,T;DOUGLAS CHOREY ;MES 14,13,U;VINCE HAU-LEONG WU ;MES 14,23,H;KEITH BALL ;MES 12,22,F;JEFF MCKENNA MES 12,16,L ;CPL, INC. #1 ;MES 23,45,O;CPL, INC. #2 ENDIF ; RERUN LDX SAVEOS ;RESTORE STACK TXS ; LDA COLOR2 ;SET BORDER TO SAME COLOR AS SCREEN STA COLOR4 ; LDY #ZINITL ;INIT ZERO INIT ZP LOCATIONS TO ZERO LDA #0 ZERLOP STA ZINIT-1,Y DEY BNE ZERLOP STY BADIOF ;INIT I/O ERROR FLAG ; LDX #0 STX CDTMF5 ;INIT TIMER FLAGS DEX STX CDTMF3 ; ; ;LDY #0 ;FILL 256 BYTES WITH INTER. CHARS. OF ATASCI INTFIL TYA PHA ;CONVERT ATASCI TO INTER. REP. FORMAT ROL A ROL A ROL A ROL A AND #$3 TAX PLA AND #$9F ORA ATAINT,X STA INTTAB,Y INY BNE INTFIL ; IF PROT ;ASSEMBLY IF PROTECTION WANTED LDA #0 ;QUICK & DIRTY SIGN-ON CHECKSUM STA TEMP1 STA TEMP2 LDY #SOMLEN ; MESSC1 CLC LDA TEMP1 ADC SIGNON-1,Y STA TEMP1 LDA TEMP2 ADC #0 STA TEMP2 ; DEY BNE MESSC1 ; CMP #HIGH CHKSUM BNE MESSC2 LDA TEMP1 CMP #LOW CHKSUM BEQ MESSC3 ; MESSC2 JMP (DOSVEC) MESSC3 EQU * ENDIF ; LDA #1 ;INIT MIKE ALBAUGH'S CURSOR (AFFECTS MEMTOP) TAX JSR MCURS LDA #0 STA HPOS3 ;DISABLE CURSOR FOR NOW ; ; LDA MEMTOP ;MOVE INDIRECT-POINTER TO ZERO PAGE STA TEMP1 LDA MEMTOP+1 STA TEMP2 ; LDA #CR LDY #0 STA (TEMP1),Y STA PEND ; LDA MEMTOP+1 STA UMEMHI+1 STA ENDFRE+1 ; LDA MEMTOP STA UMEMHI STA ENDFRE ; BNE DEVSY1 DEC UMEMHI+1 DEC ENDFRE+1 ; DEVSY1 DEC UMEMHI DEC ENDFRE ; LDA #HIGH PEND STA UMEMLO+1 STA BEGFRE+1 ; LDA #LOW PEND STA UMEMLO STA BEGFRE ; INC UMEMLO INC BEGFRE BNE DEVSY2 ; INC UMEMLO+1 INC BEGFRE+1 ; DEVSY2 LDY #NFILES-2 ;ASSIGN IOCB'S TO EDIT FILES JSR GETFRE ;GET A FREE IOCB JMP ASSIG1 ; ASSIGN JSR GETFR2 ;GET A FREE IOCB ASSIG1 BNE SYSFUL ;BRANCH IF NOT ENOUGH IOCB'S FOR EDIT'S USE TXA STA FILES,Y ;FILL IN IOCB NUMBER DEY BPL ASSIGN BMI ASSIG3 ;ASSIGNMENTS MADE - CONTINUE ; IF PROT ;ASSEMBLY IF PROTECTION WANTED ;MES2 ;MES 6,10,T;FRED THORLIN ;MES 1,84,D;DALE YOCUM ;MES 18,80,-;MACROTRONICS ;MES 1,10,S;SORCIM ;MES 14,35,W;MIKE EKBERG ;MES 9,56,O;TANDEM ;MES 9,98,L;MIKE LORENZEN ;MES 7,55,L;MIKE MURDOCK ;MES 13,53,O;BRIAN JOHNSTON ;MES 7,21,S;LARRY SUMMERS ;MES 10,68,W;HARRY BROWN ;MES 5,47,J;PAM JONES ;MES 7,39,O;ECKSTROM ;MES 15,49,M;DAVE COMSTOCK ;MES 15,31,C;STEVE TECOTZKY ;MES 3,49,E;STEVE BITTROLFF ;MES 5,80,Y;KELCY ;MES 11,3,A;PAUL LAUGHTON ;MES 18,74,E;LISA BAILEY ;MES 14,16,B;CAROL ABBOTT ;MES 4,8,H;JOHN POWERS ;MES 6,24,I;CYNTHIA RUSSELL ;MES 11,77,A;DOUGLAS CHOREY ;MES 10,74,E;VINCE HAU-LEONG WU ;MES 10,74,K;KEITH BALL ;MES 17,13,K;JEFF MCKENNA MES 18,2,. ;CPL, INC. #1 ;MES 17,33,C;CPL, INC. #2 ENDIF ; SYSFUL JSR EPREF ;CLEAR EDITOR FLAGS (ESCAPE & START/STOP) LDX #SYSED ;DISPLAY "EDITOR CANNOT RUN - TOO FEW IOCBS" ERROR LDA #PUTCHR STA ICCOM,X LDA #LOW FULMES STA ICBAL,X LDA #HIGH FULMES STA ICBAH,X LDA #FULLEN STA ICBLL,X LDA #0 STA ICBLH,X JSR CIO ;HAVE CIO DISPLAY ERROR ON E: ; LDA #$08 ;WAIT FOR USER TO HIT "START" BEFORE RETURNING TO DOS STA CONSOL ASSIG2 LDA CONSOL AND #$01 BNE ASSIG2 ; JMP GODOS ;USER HIT "START" - RETURN TO DOS ; ASSIG3 EQU * ; IF DOS3-1 ;ASSEMBLY IF DOS-2 LDA REOPFG BNE ONESHT ;BRANCH IF ALREADY DELETED MEM.SAV ; LDA #'1' ;DELETE MEM.SAV IF EXISTS LDX #EXTSAV-FSPART LDY #NAMSAV-FSPART JSR MAKEFS ;CREATE THE FILESPEC LDA #DELETE LDX SCRFIL JSR SETDIO ;DELETE THE FILE (IGNORE ERRORS) ONESHT EQU * ENDIF ; JSR EPHPT ;HOME MISC. SCREEN POINTERS ; LDX KEYBD ;OPEN KEYBOARD FOR INPUT LDA #OPEN STA ICCOM,X LDA #LOW KCOLON STA ICBAL,X LDA #HIGH KCOLON STA ICBAH,X LDA #4 STA ICAX1,X JSR CIO ; LDA #GETCHR ;SET KEYBOARD TO RETURN JUST 1 CHARACTER AT A TIME STA ICCOM,X LDA #0 STA ICBLL,X STA ICBLH,X ; LDA SAVMSC ;CALC ERROR-WINDOW POINTER (EPOINT) CLC ADC #32 STA EPOINT LDA SAVMSC+1 ADC #3 STA EPOINT+1 ; LDA SAVMSC ;CALC MACRO-WINDOW POINTER (MPOINT) CLC ADC #72 STA MPOINT LDA SAVMSC+1 ADC #3 STA MPOINT+1 EJECT ; **** EDITOR SIGNON MESSAGE, ETC. **** ; ; ; BIT REOPFG ;SKIP SIGN-ON MESSAGE IF RE-OPENING THE FILE BPL HELLO ;BRANCH TO SIGN-ON ; LDA SDRIVE ;SWAP SOURCE & DESTINATION DRIVE NUMBERS LDX DDRIVE STX SDRIVE STA DDRIVE JMP DEBAK ;CONTINUE RE-OPENING THE EDITOR WITH THE SAME FILE ; REASK JSR DELAY ;DELAY BEFORE REDISPLAYING FILENAME-IS PROMPT ; HELLO JSR EPREF ;CLEAR EDITOR FLAGS (ESCAPE & START/STOP) LDX #SYSED ;OUTPUT SIGN-ON MESSAGE WITH SYSTEM SCREEN EDITOR LDA #PUTCHR ;USE CIO PUT-CHAR MODE STA ICCOM,X LDA #LOW SIGNON STA ICBAL,X LDA #HIGH SIGNON STA ICBAH,X LDA #SOMLEN STA ICBLL,X LDA #0 STA ICBLH,X JSR CIO ;CALL CIO TO DISPLAY MESSAGE ; JSR EPRCH ;REMOVE ANY PRE-MATURE KEYSTROKE ; * **************************************************************************** LDA #$0D STA ROWCRS LDA #$02 STA COLCRS ************************************************************************** LDX #SYSED LDA #PUTCHR STA ICCOM,X LDA #LOW ASKFIL ;PROMPT USER FOR INPUT FILENAME STA ICBAL,X LDA #HIGH ASKFIL STA ICBAH,X LDA #FNPLEN ;ASK FOR FILENAME MESSAGE STA ICBLL,X JSR CIO ;CALL CIO TO DISPLAY MESSAGE LDA #GETREC ;ASK USER FOR FILENAME STA ICCOM,X LDA #LOW INBUF STA ICBAL,X LDA #HIGH INBUF STA ICBAH,X LDA #17+FNLEN ;ALLOW UPTO 25 CHARS FOR INPUT FILENAME W/ PARAMS STA ICBLL,X JSR CIO ;CALL CIO TO ASK FOR FILENAME BPL ANSOK ;BRANCH IF NO ERRORS CPY #137 BNE W1 ;BRANCH IF NOT 137 ERROR ; LDY #LLERRM JSR DISOER ;DISPLAY & BEEP WITH "LINE TOO LONG" ERROR JMP REASK ;ASK USER AGAIN ; W1 CPY #136 BEQ W3 ;BRANCH IF KEYBOARD EOF (^3) JMP GODOS ;USER HIT BREAK - EXIT EDITOR ; ANSOK LDA #CR STA SDELIM LDX #0 ;PARSE FILENAME TO EDIT JSR FNPARS BCC ANSOK1 W3 LDY #IFERRM ;DISPLAY ILLEGAL FILENAME MESSAGE ; REASKD JSR DISOER ;DISPLAY THE ERROR JMP REASK ; ANSOK1 STX TEMP1 LDX #EXTTMP-FSPART+3 ;POINT TO .TMP JSR CHKEXT ;SEE IF EXT IS .TMP BEQ W3 ;BRANCH IF ILLEGAL EXT .TMP LDX #EXTBAK-FSPART+3 ;POINT TO .BAK JSR CHKEXT ;SEE IF EXT IS .BAK BEQ W3 ;BRANCH IF ILLEGAL EXT .BAK ; LDX TEMP1 ;RECOVER X-REG WHICH HAS OFFSET TO FILESPEC LDA CTSBUF ;MOVE DRIVE #, FILENAME, & EXTENSION STA SDRIVE STA DDRIVE ;DESTINATION DRIVE DEFALUTS TO SOURCE DRIVE LDY #FNLEN+3 MOVFIL LDA CTSBUF,Y STA NAMFIL-1,Y DEY BNE MOVFIL ; LDY #3 ;INIT CUSTOMIZING FILE EXTENSION TO SOURCE EXTENSION INITYP LDA CTSBUF+FNLEN,Y STA TYPCUS-1,Y DEY BNE INITYP ; STY DEFLAG ;INIT DELETE BACKUP FLAG STY TEMP1 ;INIT PARAMETER USED FLAGS (DEST. DRIVE) STY TEMP2 ;(EXTENSION OVERRIDE) STY TEMP3 ;(DELETE) ; ISPAR LDA INBUF,X ;GET FILENAME TERMINATION CHARACTER CMP #CR BEQ DEBAK ;BRANCH IF FOUND TERMINATOR CMP #',' BNE ILLOPT ;BRANCH IF FOUND GARBAGE ; INX LDA INBUF,X ;GET FIRST CHARACTER OF PARAMETER JSR UPCASE ;CONVERT TO UPPER CASE CMP #'D' BEQ DELPAR ;BRANCH IF DELETE PARAMETER CMP #'.' ;BRANCH IF CUSTOMIZING EXTENSION PARAMETER BEQ EXTPAR CMP #'1' BCC ILLOPT ;BRANCH IF SYNTAX ERROR CMP #'9' BCS ILLOPT ;BRANCH IF SYNTAX ERROR ; ;DRVPAR LDY TEMP1 BNE ILLOPT ;BRANCH IF THIS IS SECOND DRIVE PARAMTER STA DDRIVE ;SAVE DESTINATION DRIVE REQUESTED STY TEMP1 ;SET FLAG NON-ZERO SO ONLY 1 DRIVE PARAMETER ; NXTPAR INX ;GET READY FOR NEXT PARAMETER LDA INBUF,X JMP ISPAR ; EXTPAR LDY TEMP2 BNE ILLOPT ;BRANCH IF SECOND OVERRIDE EXTENSION LDA #' ' ;HANDLE CUSTOMIZING EXTENSION STA TEMP2 ;SET FLAG TO SAY OVERRIDE PARAMETER USED LDY #3 BLKTYP STA TYPCUS-1,Y ;INIT BUFFER WITH BLANKS DEY BNE BLKTYP ; EXTP1 INX LDA INBUF,X ;GET NEXT CHARACTER OF EXTENSION JSR UPCASE ;CONVERT TO UPPER CASE CMP #CR BEQ DEBAK ;BRANCH IF ALL DONE CMP #',' BEQ ISPAR ;FOUND NEXT PARAMETER ; JSR EPTCHR ;TEST EXTENSION CHARACTER FOR ALPHA-NUMERICS BCS ILLOPT ;BRANCH IF ILLEGAL EXTENSION CHARACTER ; STA TYPCUS,Y ;MOVE EXTENSION CHARACTER INY CPY #3 BNE EXTP1 BEQ NXTPAR ;THIS PARAMETER IS DONE ; DELPAR LDY TEMP3 BNE ILLOPT ;BRANCH IF THIS OPTION ALREADY USED STA TEMP3 ;SET FLAG TO TELL THIS PARAMETER USED STA DEFLAG ;SAVE DELETE REQUEST JMP NXTPAR ;THIS PARAMETER IS DONE ; ILLOPT LDY #UNERRM ;DISPLAY UNRECOGNIZED COMMAND ERROR JMP REASKD ; DEBAK LDA DEFLAG ;TEST DELETE-BACKUP FLAG BEQ DEBAK3 ;BRANCH IF DELETE NOT REQUESTED ; LDY #2 ;DELETE BACKUP - EXCEPT IF EDITTING THE BACKUP DEBAK1 LDA EXTFIL,Y ;COMPARE EXTENSION OF FILENAME TO .BAK CMP EXTBAK,Y BNE DEBAK2 ;BRANCH IF EXTENSION NOT .BAK DEY BPL DEBAK1 BMI DEBAK3 ;BRANCH TO IGNORE BACKUP DELETE - EDITTING .BAK ; DEBAK2 LDA DDRIVE ;DELETE THE BACKUP ON DESTINATION DRIVE LDY #NAMFIL-FSPART LDX #EXTBAK-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDX SCRFIL LDA #DELETE JSR SETDIO ;HAVE CIO DELETE THE FILE JSR CHKERR ;TEST FOR ERRORS LDA DDRIVE ;TO MAXIMIZE SPACE, ALSO DELETE THE FILE ON... CMP SDRIVE ;...THE DESTINATION DRIVE;EXCEPT IF THE ... BEQ DEBAK3 ;...DESTINATION IS ALSO THE SOURCE. ; LDY #NAMFIL-FSPART ;DELETE THE FILE WITH THE SAME NAME ON THE LDX #EXTFIL-FSPART ;...DESTINATION DRIVE. JSR MAKEFS ;CREATE THE FILE SPEC LDA #DELETE LDX SCRFIL JSR SETDIO ;HAVE CIO DELETE THE FILE JSR CHKERR ; DEBAK3 EQU * ; IF DOS3-1 ;ASSEMBLY FOR DOS-2 LDA SDRIVE ;MAKE SURE SOURCE BACKUP FILE IS UNLOCKED OR DOES NOT EXIST LDY #NAMFIL-FSPART LDX #EXTBAK-FSPART JSR CHLOCK BCC NOTLOC ;BRANCH IF FILE NOT LOCKED ; FILELK LDY #FLERRM JMP REASKD ;DISPLAY FILE LOCKED ERROR ; NOTLOC LDA #0 ;SET FILE SIZE TO ZERO STA TEMP3 STA TEMP4 LDA SDRIVE ;MAKE SURE SOURCE FILE IS UNLOCKED LDY #NAMFIL-FSPART LDX #EXTFIL-FSPART JSR CHLOCK ;CHECK FILE LOCKED & GET FILESIZE BCS FILELK ;BRANCH IF FILE LOCKED COPYW TEMP5,TEMP3 ;SAVE FILE SIZE IN TEMP5 & 6 ; LDA DDRIVE CMP SDRIVE BEQ CUSTOM ;IF DESTINATION IS SAME AS SOURCE DRIVE - BRANCH ; LDY #NAMFIL-FSPART LDX #EXTFIL-FSPART JSR CHLOCK BCS FILELK ENDIF ; CUSTOM BIT REOPFG ;TEST IF INITIAL OPENING OR RE-OPENING OF EDITOR BPL *+5 ;BRANCH IF RE-OPENING EDITOR - USE OLD VALUES JMP CUSUSE ;OOPS, BRANCH BMI OUT OF RANGE ; LDA SDRIVE ;LOOK FOR CUSTOMIZING FILE ON SOURCE DRIVE LDY #NAMCUS-FSPART LDX #EXTCUS-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDX SCRFIL LDA #4 ;READ ONLY FILE STA ICAX1,X LDA #OPEN JSR SETDIO ;HAVE CIO OPEN THE FILE BMI CUSDEF ;IF ANY ERRORS, USE DEFAULTS ; LDA #0 ;CUSTOMIZING FILE OPEN, NOW READ IT STA ICBLH,X LDA #CUSLEN STA ICBLL,X LDA #LOW CUSTAB STA ICBAL,X LDA #HIGH CUSTAB STA ICBAH,X LDA #GETCHR STA ICCOM,X JSR DISKIO ;HAVE CIO READ CUSTOMIZING DATA BMI CUSDEF ;IF ANY ERRORS, USE DEFAULTS ; JSR CLODIO ;CLOSE THE FILE - ERRORS NOT IMPORTANT ; LDA COLLMT ;CHECK CRITICAL VALUES FOR PROPER RANGES CMP #201 ;CHECK ON COLUMN LIMIT99+1 BCC CUST1 ;BRANCH IF COLLUMN LIMIT OK LDA #200 ;ASSUME WANTED LARGE AS POSSIBLE CUST1 CMP #2 BCS CUST2 ;BRANCH IF COLUMN LIMIT OK LDA #2 ;ASSUME WANTED SMALL AS POSSIBLE CUST2 STA COLLMT ;SAVE SAFE COLUMN LIMIT ; LDA LMARGV ;CHECK LEFT MARGIN VALUE BEQ MARBAD ;BRANCH IF MARGIN VALUE ERROR LMEQU0 CMP RMARGV BCS MARBAD ;BRANCH IF MARGIN VALUE ERROR LM>EQURM LDA RMARGV CMP #41 BCC CUST4 ;BRANCH IF MARGIN VALUES OK ; MARBAD LDA #2 ;MARGIN(S) VALUES BAD - ASSUME DEFAULT MARGINS STA LMARGV ;SET LEFT MARGIN TO 2 LDA #40 STA RMARGV ;SET RIGHT MARGIN TO 40 ; LDY #MVERRM JSR DISOER ; CUST4 JMP CUSUSE ;SAFE ENOUGH TO USE ; CUSDEF LDY #UDERRM ;TELL USER USING DEFAULT SETTING JSR DISOER JSR DELAY ;DELAY SO USER CAN SEE MESSAGE JSR CLOSCR ;FREE UP THE IOCB ; LDY #CUSLEN ;MOVE INTERNAL DEFAULTS TO CUSTOM TABLE CUST5 LDA DEFALT-1,Y STA CUSTAB-1,Y DEY BNE CUST5 ; CUSUSE EQU * LDY LMARGV DEY STY LMARG ;DEFINE INTERNAL (OLD WAY) OF LEFT MARGIN LDA #40 SEC SBC RMARGV STA RMARG ;DEFINE INTERNAL (OLD WAY) OF RIGHT MARGIN ; IF DOS3-1 ;ASSEMBLY FOR DOS-2 CLC ;ADD FILE SIZE AND REQUESTED MAX GROWTH LDA TEMP5 ADC GROWTH STA TEMP3 ;SAVE IN TEMP3 & 4 LDA TEMP6 ADC #0 STA TEMP4 ; IFGT TEMP1,TEMP3,FSIGNO ;IF FREE-SPACE > FILE-SIZE+GROWTH THEN OK SO BRANCH ; COPYW FRO,TEMP5 ;CONVERT FILESIZE TO ATASCII JSR IFP ;CONVERT INTEGER TO FP JSR FASC ;CONVERT FP TO ATASCII LDA #LOW SIZASC ;POINT TO DISPLAY MESSAGE BUFFER LDY #HIGH SIZASC JSR MOVASC ;MOVE NUMBER TO DISPLAY MESSAGE ; COPYW FRO,TEMP1 ;CONVERT FREE SPACE TO ATASCII JSR IFP ;CONVERT INTEGER TO FP JSR FASC ;CONVERT FP TO ATASCII LDA #LOW FREASC ;POINT TO DISPLAY MESSAGE BUFFER LDY #HIGH FREASC JSR MOVASC ;MOVE NUMBER TO DISPLAY MESSAGE ; JSR EPREF ;CLEAR EDITOR FLAGS (ESCAPE & START/STOP) LDX #SYSED ;DISPLAY WARNING WITH E: LDA #PUTCHR STA ICCOM,X LDA #LOW FSMESG STA ICBAL,X LDA #HIGH FSMESG STA ICBAH,X LDA #FSMLEN STA ICBLL,X LDA #0 STA ICBLH,X JSR CIO ;HAVE CIO DISPLAY LIMITED FREE SPACE ERROR MESSAGE ; JSR EPRCH ;REMOVE ANY PRE-MATURE KEYSTROKE ; LDX KEYBD ;WAIT FOR USER TO HIT "A"BORT OR "I"GNORE SAYWHA JSR CIO ;HAVE CIO WAIT FOR KEYSTROKE BMI SAYWHA ;WHY DID HE DO THAT ; JSR UPCASE ;CONVERT TO UPPER CASE CMP #'I' BEQ FSIGNO ;BRANCH TO IGNORE WARNING ; CMP #'A' BNE SAYWHA ;WAIT UNTIL USER CAN FIGURE IT OUT ; JMP GODOS ;ABORT EDIT SESSION - RETURN TO DOS ; FSIGNO EQU * ENDIF ; LDA #0 STA EOFLAG ;CLEAR ANY PREIVOUS STATUS CODE LDA SDRIVE ;OPEN INPUT FILE LDY #NAMFIL-FSPART LDX #EXTFIL-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDX INFILE LDA #4 STA ICAX1,X ;SET AUX1 TO READ ONLY LDA #OPEN JSR SETDIO ;HAVE CIO OPEN THE INPUT FILE BPL OPENOF ;BRANCH IF NO I/O ERRORS ; CPY #170 ;IF FILE NOT FOUND - MAKE IT BNE OPBAD STY EOFLAG ;TREAT AS ALREADY FINISHED INPUT FILE LDY #NFERRM ;NEW-FILE WARNING JSR DISOER JMP OPENOF OPBAD JSR DISOER JSR CLODIO ;FREE THE IOCB JMP REASK ; OPENOF LDA #$80 ;INIT VIRGIN OUTPUT FLAG WHEN OPEN OUTPUT STA VIRGIN LDA DDRIVE ;OPEN TEMPORARY OUTPUT FILE (.TMP) LDX #EXTTMP-FSPART LDY #NAMFIL-FSPART JSR MAKEFS ;CREATE THE FILE SPEC LDX OUTFIL LDA #8 ;SET AUX1 TO OPEN FOR OUTPUT (DELETE IF PRESENT) STA ICAX1,X LDA #OPEN JSR SETDIO ;HAVE CIO OPEN THE FILE BPL OPGOOD ;BRANCH IF HAD TROUBLE OPENING OUTPUT FILE ; JSR DISOER ;DISPLAY OPENNING OUTPUT ERRORF JSR CLODIO ;FREE THE IOCB LDX INFILE JSR CLODIO ;FREE THE INPUT IOCB JMP REASK ;TRY AGAIN ; OPGOOD LDA COLORL STA COLOR1 ; IF PROT ;ASSEMBLY IF PROTECTION WANTED ;MES3 ;MES 7,27,H;FRED THORLIN ;MES 8,17,C;DALE YOCUM ;MES 4,13,M;MACROTRONICS ;MES 4,3,C;SORCIM ;MES 18,57,B;MIKE EKBERG ;MES 3,42,N;TANDEM ;MES 14,77,Z;MIKE LORENZEN ;MES 3,48,C;MIKE MURDOCK ;MES 2,64,R;BRIAN JOHNSTON ;MES 10,14,M;LARRY SUMMERS ;MES 3,29,R;HARRY BROWN ;MES 1,62,P;PAM JONES ;MES 3,50,K;ECKSTROM ;MES 20,36,K;DAVE COMSTOCK ;MES 9,22,J;STEVE TECOTZKY ;MES 15,16,B;STEVE BITTROLFF ;MES 1,33,K;KELCY ;MES 15,28,T;PAUL LAUGHTON ;MES 12,60,N;LISA BAILEY ;MES 3,43,R;CAROL ABBOTT ;MES 22,81,I;JOHN POWERS ;MES 5,62,H;CYNTHIA RUSSELL ;MES 23,98,Y;DOUGLAS CHOREY ;MES 23,60,U;VINCE HAU-LEONG WU ;MES 18,65,L;KEITH BALL ;MES 8,70,-;JEFF MCKENNA MES 23,17,E ;CPL, INC. #1 ;MES 21,5,T;CPL, INC. #2 ENDIF ; LDA COLOR ;GET COLOR OF SCREEN DURING EDIT SESSION STA COLOR2 ;MAKE BORDER SAME COLOR AS BACKGROUND STA COLOR4 ; LDA CASE ;START EDIT WITH PREFERED CASE LOCK STA SHFLOK ; LDA #$40 ;UPDATE RE-OPEN FLAG TO INDICATE EDITTING & RESET REOPEN FILE BIT STA REOPFG ; LDA #CR ;INIT RECOVER-LINE-BUFFER STA RLBUFR ; JSR EPRCW ;CLEAR COMMAND WINDOW BUFFER JSR EPRAW ;CLEAR ALTERNATE COMMAND WINDOW BUFFER LDY #$FF STY COMCOL STY COMCL2 INY STY COMCPT STY COMCP2 STY COMNDL ;INIT COMMAND WINDOW VARIABLES STY COMND2 JSR SETMAR ;CLEAR DISPLAY ; IF 0 BIT EOFLAG ;IF NO INPUT FILE SETUP EMPTY EDITOR BPL RINPUT ;BRANCH TO READ NORMAL INPUT JSR NOTRD ;SETUP EMPTY EDITOR JMP COMMND ; RINPUT JSR READHF ; JMP COMMND ENDIF BIT EOFLAG BMI READY ; JSR EPCIH ;AUTOMATICALLY READ IN 1ST BUFFER READY JMP COMMND ;ENTER IMMEDIATE MODE - EDITOR UP & RUNNING EJECT ; **** KEYSTROKE ENTRY POINT **** ; ; OPKEY BIT MODE ;OPION KEY PROCESSING BMI SEKEY2 ;BRANCH TO ENTER IMMEDIATE MODE W/O EXECUTING COMMAD WINDOW ; LDA #$80 STA MODE LDA SKSTAT ;GET KEYBOARD STATUS AND #$08 ;GET SHIFT-DEPRESSED BIT BEQ OPKEY2 ;BRANCH IF SHIFT KEY PRESSED (KEEP OLD COMMAND LINE) ; LDY #$FF STY COMCOL INY STY COMCPT STY COMNDL JSR EPRCW OPKEY2 JMP EPDCW ; SEKEY JSR SWAPCW ;SELECT KEY PROCESSING SEKEY2 LDA #$00 ;SET IMMEDIATE MODE STA MODE JMP EPDCW ;DISPLAY THE NEW COMMAND WINDOW ; STKEY LDA #$80 ;START KEY PROCESSING STA MODE ;IF WINDOW HAS ERROR THEN COMMAND-MODE ; IF PROT ;ASSEMBLY IF PROTECTION WANTED ;MES4 ;MES 12,5,N;FRED THORLIN ;MES 10,13,M;DALE YOCUM ;MES 13,1,I;MACROTRONICS ;MES 6,40,M;SORCIM ;MES 17,62,K;MIKE EKBERG ;MES 14,20,G;TANDEM ;MES 1,62,M;MIKE LORENZEN ;MES 13,22,O;MIKE MURDOCK ;MES 12,39,T;BRIAN JOHNSTON ;MES 1,75,L;LARRY SUMMERS ;MES 9,16,O;HARRY BROWN ;MES 8,73,E;PAM JONES ;MES 2,29,C;ECKSTROM ;MES 3,61,V;DAVE COMSTOCK ;MES 5,11,V;STEVE TECOTZKY ;MES 20,97,O;STEVE BITTROLFF ;MES 4,22,C;KELCY ;MES 2,17,P;PAUL LAUGHTON ;MES 7,59,S;LISA BAILEY ;MES 26,10,B;CAROL ABBOTT ;MES 17,39,W;JOHN POWERS ;MES 3,39,N;CYNTHIA RUSSELL ;MES 5,22,U;DOUGLAS CHOREY ;MES 18,53,O;VINCE HAU-LEONG WU ;MES 5,36,-;KEITH BALL ;MES 21,11,A;JEFF MCKENNA MES 10,50,C ;CPL, INC. #1 ;MES 10,84,C;CPL, INC. #2 ENDIF ; JSR EPDCW ;DISPLAY COMMAND WINDOW WITH CURSOR LDA COMCPT BMI STKEY1 ;BRANCH IF COMMAND LINE IS COMPLETE ; LDA COMCOL CMP #$FF BEQ STKEY1 ;BRANCH IF EMPTY WINDOW (SPECIAL CASE) ; LDY #NCERRM JMP DISERR ;DISPLAY "COMMAND NOT COMPLETE" ERROR ; STKEY1 LDA #$80 STA COMEXC ;SET EXECUTE WHILE SYNTAXING FLAG LDA #$00 STA MODE ;IF COMMAND ABORTS, LEAVE USER IN IMMEDIATE MODE STA RWFLAG ;INIT RW FLAG JSR SYNTAX ;EXECUTE COMMAND(S) JMP EPDCW ;REMOVE CURSOR FROM COMMAND WINDOW & AWAIT KEYSTROKES ; ; EPACL JSR EPDCW ;ABORT COMMAND LINE ; COMMND JSR CLOSCR ;CLOSE SCRATCH FILE IOCB (IN CASE OF ERRORS) LDX SAVEOS TXS ;CLEAR STACK JSR DISPLY ;RE-DISPLAY SCREEN AFTER EACH COMMAND LDA #HIGH [COMMND-1] ;JSR BY JMP -- RETURN ADDRESS IS "COMMND" PHA LDA #LOW [COMMND-1] PHA ; JSR EPRCH ;REMOVE ANY PRE-MATURE KEYSTROKE ; GETKEY LDA CDTMF5 ;MAIN KEYSTROKE LOOP STARTS HERE BNE GETKY9 ;BRANCH TO SKIP YELLOW KEY CHECK BECAUSE ALREADY ACTED UPON THEM LATELY ; LDA #$08 ;READ YELLOW KEYS STA CONSOL LDA CONSOL AND #$07 CMP #$07 BEQ GETKY9 ;BRANCH IF NO YELLOW KEYS DEPRESSED ; PHA ; JSR CLICK ;CLICK FOR YELLOW KEYS TOO JSR ACEW ;AUTO CLEAR ERROR WINDOW IF ITS TIME ; LDX #0 ;SET TIMER #5 FOR YELLOW KEY IGNORE LDY #20 ;APPROX. 1/3 SECOND IGNORE PERIOD LDA #5 STA CDTMF5 JSR SETVBV PLA ; LSR A BCC STKEY ;BRANCH IF START-KEY STRUCK ; LSR A BCS GETKY5 ;BRANCH IF SELECT-KEY NOT STRUCK JMP SEKEY ;SELECT-KEY STRUCK ; GETKY5 JMP OPKEY ;OPTION KEY MUST BE STUCK ; GETKY9 LDA CH ;CHECK IF KEYBOARD-KEY STRUCK CMP #$FF BEQ GETKEY ;BRANCH IF NO KEY STRUCK YET - WAIT ; PHA ;SAVE CH CODE JSR ACEW ;AUTO CLEAR ERROR WINDOW IF ITS TIME PLA ; CMP #$C0+$0E ;CHECK FOR CNTR/SHIFT CURSOR UP BNE GETKY1 ;NOPE GETKYB JSR ILLKEY ;CLICK & RESET CH FOR ILLEGAL KEY JMP PRIOR ;YEP - PAGE TO PREVIOUS PAGE ; GETKY1 CMP #$C0+$0F ;CHECK FOR CNTR/SHIFT CURSOR DOWN BNE GETKYZ ;NOPE GETKYA JSR ILLKEY ;CLICK & RESET CH FOR ILLEGAL KEY JMP NEXT ;YEP - PAGE TO NEXT PAGE **************************************************************************** GETKYZ CMP #$B5 BEQ GETKYB CMP #$B0 BEQ GETKYA ; *************************************************************************** GETKY2 CMP #$80+$0C ;CHECK FOR CNTR-RETURN AUTO INDENT BNE GETKY3 ;NOPE JSR ILLKEY ;CLICK & RESET CH FOR ILLEGAL KEY JMP EPAI ;DO AUTO-INDENT ; GETKY3 CMP #$80+$2C ;CHECK FOR REAL CNTRL.-TAB BNE GETKY4 JSR ILLKEY LDA #$9E BNE GETKY8 ;JUMP TO GOT KEYBOARD KEYSTROKE ; GETKY4 SEI ;SET SYSTEM TIMER #2 SO K: RETURNS... LDA #$80+$2C ;NO MATER WHAT STA KTVAL LDX #LOW KEYTIM STX CDTMA2 LDX #HIGH KEYTIM STX CDTMA2+1 LDX #0 LDA #2 TAY JSR SETVBV CLI ; LDX KEYBD ;HAVE O.S. FETCH KEYSTROKE JSR CIO BPL GETKY7 ;BRANCH IF NO KEYBOARD ERRORS OR EOF CPY #136 BNE GETKY6 ;IF ERROR START LOOKING ALL OVER JMP EPCCEL ;CONTROL-3 MEANS CURSOR TO END OF LINE GETKY6 JMP GETKEY ; GETKY7 LDX #$FF STX KTVAL CMP #$9E BEQ GETKY6 ;NOT REALLY STRUCK - WAIT ; ; GETKY8 LDY #ESCAPE CPY LASTKY STA LASTKY BNE LOOK0 ;BRANCH IF LAST KEY NOT AN ESCAPE STX LASTKY ;INSURE (AS LONG AS KEYBD .NE. 0) LASTKEY NOT ESCAPE BIT MODE BMI CMODE ;BRANCH TO INSERT SPECIAL KEY INTO COMMAND BPL LOOK5 ;BRANCH TO INSERT SPECIAL KEY INTO TEXT ; LOOK0 CMP #ESCAPE BEQ GETKY6 ;BRANCH IF START OF ESCAPE SEQUENCE ; LDY #0 LOOK3 CMP KEYTAB,Y ;TEST KEYSTROKE AGAINST COMMAND KEYSTROKE LIST BNE LOOK4 ;BRANCH IF NOT RECOGNIZED KEY ; TYA ;ITS A SPECIAL KEY - PROCESS THE COMMAND ASL A ;RETURN TO "COMMND" UPON RTS TAY LDA KEYROU+1,Y PHA LDA KEYROU,Y PHA RTS ;JUMP TO ROUTINE VIA RTS ; LOOK4 INY CPY #KEYLEN BNE LOOK3 ;BRANCH BACK IF STILL MORE ENTRIES TO CHECK BIT MODE BMI CMODE ;BRANCH IF IN COMMAND-MODE CMP #KBACKS ;"DELETE-LEFT" KEYSTROKE BNE LOOK5 JMP DELLS ;JSR TO DELETE-LEFT ROUTINE LOOK5 JMP INSSC ;JSR TO INSERT-CHAR-INTO-TEXT ROUTINE ; ILLKEY LDA #$FF ;CLICK & RESET CH TO $FF FOR RECOGNIZED ILLEGAL KEY STA CH JMP CLICK ; ACEW LDA CDTMF4 ;CHECK IF TIME TO AUTO-CLEAR ERROR WINDOW BNE ACEW1 ;BRANCH IF NOT THE TIME ; LDA #$FF STA CDTMF4 ;ONLY CLEAR WINDOW ONCE JSR CEW ;CLEAR ERROR WINDOW ACEW1 RTS ; EJECT ; **** COMMAND MODE KEYSTROKE CONTROL **** ; ; CMODE BIT COMNDL ;IF PREVIOUS ERROR - ONLY WANT DELETE BPL CMODE1 ;BRANCH IF NO PREVIOUS ERROR ; CMP #KBACKS BEQ CMODE1 ;BRANCH IF IT WAS A DELETE ; JMP BELL ;IGNORE KEYSTROKE & BEEP ; CMODE1 CMP #KBACKS BNE CMODE3 ;BRANCH IF NOT DELETE-KEY LDY COMCOL BPL CMODE2 ;BRANCH IF SOMETHING IN BUFFER TO DELETE RTS ;DELETED NOTHING - SO WHAT ; CMODE2 LDA #0 ;DELETE CHARACTER IN COMMAND WINDOW STA COMNDL LDY COMCOL LDA #$20 ;REPLACE DELETED CHARACTER WITH A BLANK STA INBUF,Y DEC COMCOL ;DELETE - SO BACKUP 1 COLUMN JSR EPDCW JMP CMODE6 ; CMODE3 LDY COMCOL CPY COMLMT ;IGNORE KEYSTROKE IF BUFFER FULL BNE CMODE4 ;BRANCH IF NOT FULL LDY #LLERRM JMP DISERR ;"LINE TOO LONG" ERROR ; CMODE4 INC COMCOL ;BUMP COLUMN COUNTER LDY COMCOL STA INBUF,Y ;PUT CHARACTER IN BUFFER JSR EPDCW ;RE-DISPLAY COMMAND WINDOW WITH NEW CHARACTER CMODE6 LDY #0 STY COMEXC ;SET FLAG SO NOT EXECUTE- ONLY SYNTAX CHECK EJECT ; **** COMMAND SYNTAX CHECK & EXECUTE **** ; ; SYNTAX LDX #$FF ;SYNTAX CHECK ALL OF COMMAND BUFFER STX BRKKEY ;CLEAR BREAK KEY BEFORE EXECUTING COMMAND WINDOW SYNTX0 STX CSTART LDA BRKKEY BNE SYNTX7 ;BRANCH IF BREAK KEY NOT PRESSED ; DEC BRKKEY ;RESET BREAK FLAG LDY #BAERRM ;POINT TO BREAK ABORT ERROR TEXT JMP DISERR ;DISPLAY ERROR & ABORT COMMAND LINE ; SYNTX7 LDY #0 STY COMCPT ; LDA CTAB,Y SYNTX1 CMP #$FF ;CHECK AGAINST EOF-OF-TABLE MARKER BNE SYNTX6 ;BRANCH IF COMMAND IN TABLE ; LDY #UNERRM ;DISPLAY "UNRECOGNIZED COMMAND" ERROR JMP SYNERR ;JUMP TO CONTINUE WITH SYNTAX ERROR ; SYNTX6 STA COMTYP ;SAVE COMMAND TYPE BITS INY LDA CTAB,Y ;SAVE ROUTINE ADDRESS STA TEMP1 INY LDA CTAB,Y STA TEMP2 ; SYNTX2 INY ;MATCH CHARS IN BUFFER TO COMMANDS IN TABLE LDA CTAB,Y BMI SYNTX4 ;BRANCH IF MATCH A COMMAND CPX COMCOL BNE TOOFAR JMP NOTFIN TOOFAR INX CMP INBUF,X BEQ SYNTX2 ;BRANCH IF MATCHING SO FAR CLC ADC #32 ;CHECK FOR LOWER CASE COMMANDS CMP INBUF,X BEQ SYNTX2 ;THIS EDITOR JUST SO DAMM SMART ; LDX CSTART ;RECOVER INDEX TO LAST COMMAND IN BUFFER SYNTX3 INY LDA CTAB,Y BMI SYNTX1 ;BRANCH IF FOUND START OF NEXT COMMAND IN TABLE BPL SYNTX3 ;KEEP LOOKING FOR NEXT COMMAND IN TABLE ; SYNTX4 LDA #0 STA COMC1 STA COMC2 LDA COMTYP ;FOUND COMMAND CMP #$80 BEQ NOTNUM AND #$01 BEQ LNUM0 ;BRANCH IF EXPECT AN OPTIONAL NUMBER JMP FSTRG1 ;BRANCH IF EXPECT A STRING NEXT ; NOTNUM LDA #$80 COMPLT STA COMCPT ;COMMAND IS COMPLETLY PROCESSED ; BIT COMEXC ;SYNTAX OR EXECUTE BPL SYNTX5 ;BRANCH IF JUST A SYNTAX CHECK LDA $B5 ORA $B6 BNE COMPL1 LDA $4FD3 AND #$04 BNE COMPL1 INC $B5 COMPL1 TXA ;SAVE X & Y PHA TYA PHA LDA #HIGH [EXCRTN-1] ;SETUP RETURN ADDRESS PHA LDA #LOW [EXCRTN-1] PHA JMP (TEMP1) ;INDIRECT JSR TO ROUTINE ; EXCRTN PLA ;RECOVER REGISTERS TAY PLA TAX ; SYNTX5 CPX COMCOL BEQ ARTS ;ALL DONE JMP SYNTX0 ;BRANCH BACK TO START ANOTHER COMMAND ARTS RTS EJECT ; **** SYNTAX CHECKING ROUTINES **** ; ; LNUM0 CPX COMCOL BEQ NOTNUM LDA #0 STA TEMP9 ;LEADING ZEROES NOT ALLOWED ; LNUM LDA INBUF+1,X ;LOOK FOR OPTIONAL NUMBER SEC SBC #$30 ;REDUCE POSSIBLE ATASCI NUMBER TO 0-9 CMP #10 BCS NOTNUM ;BRANCH IF THIS CHARACTER NOT A NUMBER ; STA TEMP6 STY TEMP3 ;MULTIPLY OLD NUMBER BY TEN & ADD IN NEW NUMBER TAY BNE NOTZER LDY TEMP9 NOTNM1 BEQ NOTNUM ;BRANCH IF ILLEGAL LEADING ZERO NOTZER LDY #1 STY TEMP9 ;FUTURE ZEROES OK ; LDY #9 LDA COMC1 STA TEMP7 LDA COMC2 STA TEMP8 ; MULT10 LDA TEMP7 ;GET LOW BYTE ADC COMC1 ;ADD TO ITSELF 10 TIMES TO MULT BY 10 STA COMC1 LDA TEMP8 ;GET HIGH BYTE ADC COMC2 ;ADD TO ITSELF 10 TIMES W/ CARRY TO MULT BY 10 STA COMC2 BCS OVERFL ;BRANCH IF OVERFLOW (>65,536) DEY BNE MULT10 ;LOOP BACK ; LDA TEMP6 ADC COMC1 ;ADD NEW DIGIT TO OLD NUMBER TIMES 10 STA COMC1 LDA COMC2 ADC #0 STA COMC2 BCS OVERFL ;BRANCH IF OVERFLOW (>65,536) ; LDY TEMP3 INX ;LOOK FOR NEXT DIGIT CPX COMCOL BEQ NOTNM1 SINFUL BNE LNUM ; OVERFL LDY #NOERRM ;NUMERIC OVERFLOW (>65536) SYNERR LDA #$80 STA COMNDL ;COMMAND NEEDS A DELETE LDA #0 STA COMCPT JMP DISERR ; NOTFIN LDA #0 STA COMCPT ;COMMAND NOT COMPLETE (EXECUTABLE) RTS ; ; ; FSTRG1 CPX COMCOL BEQ ARTS INX ;FIND 1ST STRING ARGUMENT ROUTINE LDA INBUF,X CMP #'/' ;SLASH IS A POSSIBLE DELIMITER STA SDELIM BEQ FSDEL ;BRANCH IF FOUND STRING DELIMITER CMP #'"' BEQ FSDEL ;BRANCH IF FOUND STRING DELIMITER ; LDY #DEERRM ;NO STRING DELIMITER ERROR BNE SYNERR ;JUMP ; FSDEL CPX COMCOL BEQ NOTFIN INX STX TEMP4 FSDEL1 LDA INBUF,X CMP SDELIM BEQ FSDEL4 ;FOUND ENDING DELIMITER CPX COMCOL BEQ NOTFIN INX BNE FSDEL1 ; FSDEL4 LDA COMTYP AND #$02 BNE FSTRG2 ;BRANCH IF EXPECT A SECOND STRING LDA COMTYP AND #$40 FSDEL3 BNE SINFUL ;BRANCH IF EXPECT A NUMBER (BNE LNUM) JMP NOTNUM ;COMMAND IS FINISHED ; ; ; FSTRG2 CPX COMCOL BEQ NOTFIN INX STX TEMP5 ;START OF 2ND STRING FSDEL2 LDA INBUF,X CMP SDELIM BEQ FSDEL5 ;BRANCH IF FOUND 2ND STRING ENDING DELIMITER ; CPX COMCOL BEQ NOTFIN ;BRANCH IF COMMAND UNFINISHED INX BNE FSDEL2 ;JUMP ; FSDEL5 LDA COMTYP AND #$40 BNE FSDEL3 ;BRANCH IF EXPECT NUMBER JMP NOTNUM ;COMMAND IS FINISHED EJECT ; **** RAM DATA AREA **** ; ; FSPART EQU * ; NAMCUS DB 'MEDIT' ;NAME OF CUSTOMIZING FILE TYPCUS DS 3 ;LANGUAGE SYSTEM EXTENSION BUILT INTO FILENAME DB ' ' ;***** IF FNLEN>12 THEN NEED TO INCREASE# OF BLANKS EXTCUS DB 'ECF' ;EXTENSION OF CUSTOMIZING FILE ; NAMSAV DB 'MEM ' ;NAME OF MEM.SAV EXTSAV DB 'SAV' ;EXTENSION OF MEM.SAV EXTTMP DB 'TMP' ;EXTENSION OF TEMPORARY FILE EXTBAK DB 'BAK' ;EXTENSION OF BACKUP FILE ; NAMFIL DS FNLEN ;NAME OF FILE TO EDIT EXTFIL DS 3 ;EXTENSION OF FILE TO EDIT ; NAMSID DS FNLEN ;NAME OF SIDE FILE EXTSID DS FNLEN ;EXTENSION OF SIDE FILE ; INBUF DS 120 ;INPUT BUFFER COMCOL DS 1 ;COMAND WINDOW COLUMN COMNDL DS 1 ;COMMAND NEEDS A DELETE;FLAG COMCPT DS 1 ;COMMAND IS COMPLETE;FLAG ; INBUF2 DS 120 ;ALTERNATE COMMAND WINDOW BUFFER COMCL2 DS 1 ;ALTERNATE COMMAND WINDOW COLUMN COMND2 DS 1 ;ALTERNATE COMMAND NEEDS A DELETE;FLAG COMCP2 DS 1 ;ALTERNATE COMMAND IS COMPLETE;FLAG ; RLBUFR DS 200 ;RESERVE SPACE FOR RECOVER-DELETED-LINE BUFFER CTSBUF DS 201 INTTAB DS 256 ;RESERVE 256 BYTES FOR DISPLAY CHARACTER LOOKUP TABLE SDRIVE DS 1 ;SOURCE DRIVE # IN ATASCI DDRIVE DS 1 ;DESTINATION DRVIE # IN ATASCI BDRIVE DS 1 ;BLOCK READ/WRITE DRIVE NUMBER ; VIRGIN DS 1 ;OUTPUT FILE IS A VIRGIN IF 7-BIT IS 1 BADIOF DS 1 ;BAD I/O OCCURED - CANNOT OC, IH, OR EXIT COMLMT DS 1 ;COMMAND WINDOW COLUMN LIMIT SAVEOS DS 1 ;SAVE O.S. STACK POINTER OLDCUR DS 1 ;MIKE A. RAM LOCATION CSTART DS 1 ;COMMAND STARTS IN COLUMN ? COMTYP DS 1 ;COMMAND TYPE BITS SDELIM DS 1 ;CURRENT STRING DELIMITER COMEXC DS 1 ;SYNTAX OR EXECUTE FLAG ; CUSTAB EQU * ;DS 6 ;6 BYTES FOR DOS 2 HEADER - EDITOR DOES NOT USE COLLMT DS 1 ;MAXIMINE LINE LENGTH (10-200) TABFAK DS 1 ;SPACE TABS ($80), EXPANDING TABS ($00) TABMAP DS 31 ;TABSTOP BITMAP TABLE CASE DS 1 ;INITIAL CASE LOCK ($00 NO-LOCK, $40 CAPS, $80 CTRL) LMARGV DS 1 ;LEFT MARGIN (1-39) RMARGV DS 1 ;RIGHT MARGIN (2-40) VISTAB DS 1 ;VIS-TAB-FLAG: SPACES ($80), TAB ($00) VISCR DS 1 ;VIS-CR-FLAG: SPACE ($00), DOWN-ARROW ($80) COLOR DS 1 ;COLOR OF SCREEN (AND'ED WITH $F7) COLORL DS 1 ;BRIGHTNESS OF CHARACTERS (OR'ED WITH $08) GROWTH DS 1 ;MINIMUM GROWTH (0-255) AUTOIF DS 1 ;AUTO-INDENTION: OFF ($00), ON ($80) CUSLEN EQU *-CUSTAB ; LMARG DS 1 ;INTERNAL LEFT MARGIN (0-5) RMARG DS 1 ;INTERNAL LEFT MARGIN (0-5) DEFLAG DS 1 ;DELETE FLAG: NO ($00), YES ("D") REOPFG DS 1 ;RE-OPEN FLAG: PROMPT/EDIT (BIT6 0,1), RERUN/REOPEN (BIT7 0,1) ERTEMP DS 1 ;ERROR ROUTINE TEMP VARIABLE RWFLAG DS 1 ;REPEAT WINDOW COMMAND FLAG RWCNTR DS 2 ;REPEAT WINDOW COMMAND COUNTER RTEMP1 DS 1 ;NON ZERO PAGE TEMP RAM RTEMP2 DS 1 ;NON ZERO PAGE TEMP RAM RTEMP3 DS 1 ;NON ZERO PAGE TEMP RAM RTEMP4 DS 1 ;NON ZERO PAGE TEMP RAM RTEMP5 DS 1 ;NON ZERO PAGE TEMP RAM RTEMP6 DS 1 ;NON ZERO PAGE TEMP RAM DS 2 ;ADDED BY DAVE FOR COMPARISON ALIGNMENT ; KTVAL DS 1 ;KEYBOARD TIMEOUT FAKE-CH VALUE ; FILES EQU * SYSED EQU $00 ;SYSTEM SCREEN EDITOR (E:) ALWAYS IOCB #00 INFILE DS 1 ;INPUT FILE IOCB NUMBER OUTFIL DS 1 ;OUTPUT FILE IOCB NUMBER KEYBD DS 1 ;KEYBOARD IOCB NUMBER SCRFIL DS 1 ;SCRATCH FILE IOCB NUMBER NFILES EQU *-FILES+1 ; ; ; PEND END EDORG